是否有一个很好的strptime()
的等效实现可用于Windows?不幸的是,这个POSIX函数似乎不可用。
Open Group description of strptime-摘要:它将文本字符串(如"MM-DD-YYYY HH:MM:SS"
)转换为tm struct
,与strftime()
相反。
是否有一个很好的strptime()
的等效实现可用于Windows?不幸的是,这个POSIX函数似乎不可用。
Open Group description of strptime-摘要:它将文本字符串(如"MM-DD-YYYY HH:MM:SS"
)转换为tm struct
,与strftime()
相反。
8条答案
按热度按时间sqougxex1#
如果你不想移植任何代码或谴责你的项目,你可以这样做:
1.使用
sscanf
解析日期1.然后将整数复制到
struct tm
中(从月减去1,从年减去1900--月是0-11,年从1900开始)1.最后,使用
mktime
获取UTC历元整数只需记住将
struct tm
的isdst
成员设置为-1,否则您将遇到夏令时问题。vuktfyat2#
假设你使用的是Visual Studio 2015或更高版本,你可以使用它作为strptime的替代品:
请注意,对于跨平台应用程序,
std::get_time
直到GCC 5.1才实现,因此直接调用std::get_time
可能不是一个选择。yzuktlbb3#
strptime()
的开源版本(BSD许可证)可以在这里找到:http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=HEAD您需要添加以下声明才能使用它:
uklbhaso4#
这样做的工作:
但是,请注意,输入字符串是YYYY-MM-DD
enyaitl35#
这是一个支持复制粘贴的the answer @amwinter posted的C示例,尽管我没有使用
sscanf()
-*scanf()
函数家族太反常了,无法进行强大的解析:(标题和错误检查被省略,以保持示例足够短,以防止创建垂直滚动条)
这是一个非常简单的例子,输入字符串的格式是完全已知的,因此非常容易解析。
dwbf0jvd6#
令我惊讶的是,如果不是难以置信的话,经过至少50年的数字数据处理,似乎仍然没有一个可接受的解决方案,为'strptime()'方法是可用的。
以下特性描述了应实现的可接受特性:
非常有用的附加功能是:
以上提出的解决方案都没有实现前四个特点,尽管我认为它们是合理的。使用标准C++库可能会使'strptime'函数过时,但对我来说,这个库非常混乱,不容易使用。
出于这些原因,我设计了以下两个实现,它们彼此一致,并提供了所有上述功能。
它们发布在github上的一个名为
strptime-for-Windows-Linux。
这两个函数都由两个文件(LibOb_strptime.h和LibOb_strptime.c)提供。
唯一的“成本”是传输时区和语言数据的附加指针参数,但如果仅使用常规功能就足够了,则可以将它们全部设置为0。这些函数故意不使用系统的“本地化”,这在文档中有解释。
对于C++程序员来说,cTime类与这个“strptime”实现密切相关,可能会感兴趣。
elcex8rz7#
一种替代方法是使用
GetSystemTime
并将时间信息发送给一个函数,该函数根据您使用vsnprintf_s
的格式解析时间信息。在下面的例子中,有一个函数创建了一个毫秒精度的时间字符串。然后,它将字符串发送给一个函数,该函数根据所需的格式对其进行格式化:bihw5rsg8#
在https://github.com/p-j-miller/date-time上有一个用于windows的strptime()版本。同一个位置包括一个匹配的strftime()函数和一个全面的测试程序。如果您需要创建在两个操作系统上都能工作的代码,这也适用于Linux。