有谁知道如何从ISO-8601格式的日期/时间字符串转到time_t
?
我使用的是C ++,它需要在Windows和Mac上运行。
我已编写代码,但我确信有一个更“标准”的版本。
我会得到2011-03-21 20:25
之类的日期,我必须告诉时间是过去还是将来。
答案 0 :(得分:7)
我认为一个丑陋的黑客很有趣:因为您只想确定哪个日期/时间更大,您可以将日期转换为字符串并比较字符串。 ;-)(好处是你不需要在任何地方都没有的strptime。)
#include <string.h>
#include <time.h>
int main(int argc, char *argv[])
{
const char *str = "2011-03-21 20:25";
char nowbuf[100];
time_t now = time(0);
struct tm *nowtm;
nowtm = localtime(&now);
strftime(nowbuf, sizeof(nowbuf), "%Y-%m-%d %H:%M", nowtm);
if (strncmp(str, nowbuf, strlen(str)) >= 0) puts("future"); else puts("past");
return 0;
}
答案 1 :(得分:6)
您可以使用strptime
从字符串转换为struct tm
,然后您可以使用mktime
从struct tm
转换为time_t
。例如:
// Error checking omitted for expository purposes
const char *timestr = "2011-03-21 20:25";
struct tm t;
strptime(timestr, "%Y-%m-%d %H:%M", &t);
time_t t2 = mktime(&t);
// Now compare t2 with time(NULL) etc.
答案 2 :(得分:0)
如果时间戳位于本地时区,则以下方法将从ISO8601转换为UTC。同样,它也不忽视潜在的夏时制。它是标准的C99。
#include <stdio.h>
#include <time.h>
time_t from_iso8601_utc(const char* dateStr)
{
struct tm t;
int success = sscanf(dateStr, "%d-%d-%dT%d:%dZ", /* */
&t.tm_year, &t.tm_mon, &t.tm_mday, &t.tm_hour, &t.tm_min);
if (success != 5) {
return 0;
}
/* compensate expected ranges */
t.tm_year = t.tm_year - 1900;
t.tm_mon = t.tm_mon - 1;
t.tm_sec = 0;
t.tm_wday = 0;
t.tm_yday = 0;
t.tm_isdst = 0;
time_t localTime = mktime(&t);
time_t utcTime = localTime - timezone;
return utcTime;
}