如何在c中将datetime转换为unix时间戳?
题
场景是:我以格式“YYYY-MM-DD HH:MM:SS”获得日期时间。用libexif。为了最大限度地降低节省成本,我想将日期时间转换为unix时间戳或类似,仅花费64位或32位。 c有什么明确的方法吗?
其他提示
将日期/时间的每个部分转换为整数以填充 struct tm
,然后使用 time_t linux.die.net/man/3/ctime“rel =”nofollow noreferrer“> mktime 。
这是c /伪代码中的有线解决方案我刚刚一起入侵。祝你好运!
char * runner = NULL;
char *string_orig = "YYYY-MM-DD HH:MM:SS";
time_t time = 0;
struct tm tmp;
use strstr(string_orig, "-") and atoi foreach
tmp->tm_year ..
tmp->tm_mon ..
tmp->tm_mday ..
tmp->tm_hour ..
tmp->tm_min ..
tmp->tm_sec ..
with *runner as help
time = mktime(&tm)
sscanf怎么样?
struct tm tmVar;
char *strVar = "YYYY-MM-DD HH:MM:SS";
time_t timeVar;
if(sscanf(strVar, "%d-%d-%d %d:%d:%d", &tm.tm_year, /* the other fields */)==6)
timeVar = mktime(&tmVar);
else
// bad format
当strptime不可用时,这是一个现成的片段:
#include <stddef.h>
#include <time.h>
#include <stdio.h>
time_t string_to_seconds(const char *timestamp_str)
{
struct tm tm;
time_t seconds;
int r;
if (timestamp_str == NULL) {
printf("null argument\n");
return (time_t)-1;
}
r = sscanf(timestamp_str, "%d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
if (r != 6) {
printf("expected %d numbers scanned in %s\n", r, timestamp_str);
return (time_t)-1;
}
tm.tm_year -= 1900;
tm.tm_mon -= 1;
tm.tm_isdst = 0;
seconds = mktime(&tm);
if (seconds == (time_t)-1) {
printf("reading time from %s failed\n", timestamp_str);
}
return seconds;
}
在sscanf中根据需要调整自己的字符串。要忽略时区并始终将GMT / UTC转换为 timezone
(或 _timezone
) seconds
( timezone
) global在time.h中定义。通过将 tm
的 tm_isdst
字段归零,DST已被忽略。
Linux支持 getdate()
函数,我认为这比直接调用 strptime()
更实用。这是因为 getdate()
函数会自动检查许多格式。它等同于使用各种格式调用 strptime()
,直到函数工作或所有格式都经过测试。
// 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));
注意: timegm()
类似于 mktime()
,只是它忽略了语言环境并使用了UTC。在大多数情况下,这是转换日期的正确方法。
datemsk.fmt文件至少包含这两种格式以支持上述日期:
%Y-%b-%d %H:%M:%S
%b/%d/%Y %H:%M:%S
支持的格式数量不受限制,但您可能不希望拥有太多。如果你有太多的格式,它会相当慢。您还可以动态管理格式并在循环中调用 strptime()
。
Linux还提供了一个线程安全的 getdate_r()
函数。
手册页: http://pubs.opengroup.org/onlinepubs/ 7908799 / XSH / getdate.html