// setenv() should be called only once
setenv("DATEMSK", "/usr/share/myprog/datemsk.fmt", 0);
// convert a date
struct tm * t1(getdate("2018-03-31 14:35:46"));
if(t1 == nullptr) ...handle error...
time_t date1(timegm(t1));
// convert another date
struct tm * t2(getdate("03/31/2018 14:35:46"));
if(t2 == nullptr) ...handle error...
time_t date2(timegm(t2));
7条答案
按热度按时间7xllpg7q1#
您可以尝试strptime和mktime的组合
rbl8hiat2#
将日期/时间的每个部分转换为整数以填充
struct tm
,然后使用mktime将其转换为time_t
。nhn9ugyo3#
这是一个用c/伪代码编写的有线解决方案,我刚刚把它们拼凑在一起。祝好运!
lxkprmvk4#
那Sscanf呢?
46scxncf5#
当strptime不可用时,下面是一个现成的代码片段:
在sscanf中调整您自己的字符串以适应您的需要。要忽略时区并始终转换为GMT/UTC,请从
seconds
减去timezone
(或_timezone
)(在time.h中定义timezone
全局。已通过将tm
的tm_isdst
字段置零来忽略dst。j9per5c46#
Linux支持
getdate()
函数,我觉得这比直接调用strptime()
更实用。这是因为getdate()
函数会自动为您检查许多格式。它相当于使用各种格式调用strptime()
,直到函数起作用或测试完所有格式。注意:
timegm()
类似于mktime()
,不同之处在于它忽略区域设置并使用UTC。在大多数情况下,这是转换约会对象的正确方式。Datemsk.fmt文件将至少包括以下两种格式以支持上述日期:
支持的格式数量不受限制,尽管您可能不想有太多格式。如果你有太多的格式,它会变得相当慢。您还可以动态管理您的格式并在循环中调用
strptime()
。Linux还提供了线程安全的
getdate_r()
函数。手册页:http://pubs.opengroup.org/onlinepubs/7908799/xsh/getdate.html
lx0bsm1f7#
对于任何使用GCC的人来说,以下代码对我来说都很有效: