Windows 上的 strptime() 等价物?

新手上路,请多包涵

是否有适用于 Windows 的 strptime() 的良好等效实现?不幸的是,这个 POSIX 函数似乎不可用。

strptime 的 Open Group 描述- 摘要:它将 "MM-DD-YYYY HH:MM:SS" 等文本字符串转换为 tm struct ,与 strftime() 相反。

原文由 An̲̳̳drew 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

strptime() 的开源版本(BSD许可证)可以在这里找到: http ://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=

您需要添加以下声明才能使用它:

 char *strptime(const char * __restrict, const char * __restrict, struct tm * __restrict);

原文由 Adam Rosenfield 发布,翻译遵循 CC BY-SA 2.5 许可协议

这是 @amwinter 发布的答案 的可复制和粘贴的 C 示例,虽然我没有使用 sscanf() - *scanf() 函数系列是 IMO 太反常,无法做到稳健解析:

(省略了标题和错误检查以保持示例足够短以防止创建垂直滚动条)

     // format will be YYYYmmddHHMMSSZ
    const char *notAfter = getNotAfterStringFromX509Cert( x509 );
    struct tm notAfterTm = { 0 };

#ifdef _WIN32
    char buffer[ 8 ];

    memset( buffer, 0, sizeof( buffer ) );
    strncpy( buffer, notAfter, 4 );
    notAfterTm.tm_year = strtol( buffer, NULL, 10 ) - 1900;

    memset( buffer, 0, sizeof( buffer ) );
    strncpy( buffer, notAfter + 4, 2 );
    notAfterTm.tm_mon = strtol( buffer, NULL, 10 ) - 1;

    memset( buffer, 0, sizeof( buffer ) );
    strncpy( buffer, notAfter + 6, 2 );
    notAfterTm.tm_mday = strtol( buffer, NULL, 10 );

    memset( buffer, 0, sizeof( buffer ) );
    strncpy( buffer, notAfter + 8, 2 );
    notAfterTm.tm_hour = strtol( buffer, NULL, 10 );

    memset( buffer, 0, sizeof( buffer ) );
    strncpy( buffer, notAfter + 10, 2 );
    notAfterTm.tm_min = strtol( buffer, NULL, 10 );

    memset( buffer, 0, sizeof( buffer ) );
    strncpy( buffer, notAfter + 12, 2 );
    notAfterTm.tm_sec = strtol( buffer, NULL, 10 );

    time_t result = mktime( &notAfterTm );

这是一个非常简单的情况,输入字符串的格式完全已知,因此非常容易解析。

原文由 Andrew Henle 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题