是否有适用于 Windows 的 strptime()
的良好等效实现?不幸的是,这个 POSIX 函数似乎不可用。
strptime 的 Open Group 描述- 摘要:它将 "MM-DD-YYYY HH:MM:SS"
等文本字符串转换为 tm struct
,与 strftime()
相反。
原文由 An̲̳̳drew 发布,翻译遵循 CC BY-SA 4.0 许可协议
是否有适用于 Windows 的 strptime()
的良好等效实现?不幸的是,这个 POSIX 函数似乎不可用。
strptime 的 Open Group 描述- 摘要:它将 "MM-DD-YYYY HH:MM:SS"
等文本字符串转换为 tm struct
,与 strftime()
相反。
原文由 An̲̳̳drew 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是 @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( ¬AfterTm );
这是一个非常简单的情况,输入字符串的格式完全已知,因此非常容易解析。
原文由 Andrew Henle 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
strptime()
的开源版本(BSD许可证)可以在这里找到: http ://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev= 头您需要添加以下声明才能使用它: