用于日期时间格式验证的C代码。指定的格式为";yyyymmddhhmmsmmmmmm“;

用于日期时间格式验证的C代码。指定的格式为";yyyymmddhhmmsmmmmmm“;,c,datetime,validation,datetime-format,C,Datetime,Validation,Datetime Format,我需要验证“yyyymmddhhmmssmmmmm”格式的日期时间值。实际上我希望的是我需要找到一个已经测试过的工作C代码来验证上述格式的日期时间值。 此外,我还有一个日期时间值,如201304011031000000。我需要一个函数来验证这是否为有效日期。[isdatetime()] 以下是格式的各个部分 YYYY : Year MM : Month DD : Day HH : hour MM : Minutes SS : seconds mmmmmm: micro-seconds 您可以使

我需要验证“
yyyymmddhhmmssmmmmm
”格式的日期时间值。实际上我希望的是我需要找到一个已经测试过的工作C代码来验证上述格式的日期时间值。 此外,我还有一个日期时间值,如
201304011031000000
。我需要一个函数来验证这是否为有效日期。[
isdatetime()
]

以下是格式的各个部分

YYYY : Year
MM : Month
DD : Day
HH : hour
MM : Minutes
SS : seconds
mmmmmm: micro-seconds

您可以使用
regex.h
for或for


“yyyyymmddhhmmssss”
类似于:
(\d{4}[0,1][0,9]\d{})
您可以找到您的特定格式,这取决于您是启用
24
还是
12
时钟等。

如果您在POSIX系统上,这看起来像是应该处理的东西,但“毫秒”(或微秒)除外零件不是由
strtime()
或我所知道的任何其他标准转换函数处理的

假设问题要求微秒,您可以使用以下主题的变体:

#include <stdio.h>
#include <string.h>
#include <time.h>

int main(void)
{
    const char  datetime[] = "20130417221633012345"; // YYYYMMDDHHMMSSFFFFFF
    struct tm   time_val;
    unsigned    microsecs;
    const char *end = strptime(datetime, "%Y%m%d%H%M%S", &time_val);
    if (end != 0)
    {
        int nbytes;
        if (strlen(end) == 6 && sscanf(end, "%6u%n", &microsecs, &nbytes) == 1 &&
            nbytes == 6)
        {
            char buffer[32];
            strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &time_val);
            printf("%s = %s.%.6u\n", datetime, buffer, microsecs);
        }
    }
    return 0;
}
#包括
#包括
#包括
内部主(空)
{
常量字符日期时间[]=“20130417221633012345”;//yyyymmddhhmmssfffff
结构tm时间值;
无符号微秒;
const char*end=strtime(日期时间,%Y%m%d%H%m%S),&time\u val);
如果(结束!=0)
{
整数字节;
如果(strlen(end)=6和&sscanf(end,%6u%n,µsecs,&nbytes)==1&&
n字节==6)
{
字符缓冲区[32];
strftime(buffer,sizeof(buffer),%Y-%m-%d%H:%m:%S),&time\val);
printf(“%s=%s.%.6u\n”、日期时间、缓冲区、微秒);
}
}
返回0;
}

修订要求
#包括
#包括
#包括
int isdatetime(常量字符*日期时间)
{
//日期时间格式为yyyymmddhhmmssfffff
结构tm时间值;
无符号微秒;
整数字节;
const char*end=strtime(日期时间,%Y%m%d%H%m%S),&time\u val);
如果(结束!=0&&strlen(结束)==6&&
sscanf(结束,“%6u%n”、µsecs和&nbytes)==1和&nbytes==6)
返回1;//有效
返回0;//无效
}

MSSSS
中的
M
是什么?你有5个毫秒的数字?如果
M
也是一个数字,那么您将有6个小数位数表示微秒;毫秒只需要三位数。您希望将这些数据转换成什么二进制格式<代码>结构时间值
<代码>结构时间规范?还有什么?实际上我需要做的是,我已经在你的代码中有了一个日期时间值,比如“20130417221633012345”。我需要验证此值以验证它是否为有效的日期时间值。你的代码对我来说是很容易理解的,你能专注于我的目标吗。感谢和问候。两个
if
语句缺少的
else
子句可用于检测和报告错误。您可能希望,也可能不希望,对微秒中缺少的数字宽大处理。但是,通过在那些缺少的
else
子句中编写或以其他方式报告错误,您就可以得到您所追求的错误处理。
#include <stdio.h>
#include <string.h>
#include <time.h>

int isdatetime(const char *datetime)
{
    // datetime format is YYYYMMDDHHMMSSFFFFFF
    struct tm   time_val;
    unsigned    microsecs;
    int         nbytes;
    const char *end = strptime(datetime, "%Y%m%d%H%M%S", &time_val);

    if (end != 0 && strlen(end) == 6 &&
        sscanf(end, "%6u%n", &microsecs, &nbytes) == 1 && nbytes == 6)
        return 1;   // Valid
    return 0;       // Invalid
}