5

我无法找到一种方法来从如下字符串中解析时区:“Thu, 1 Sep 2011 09:06:03 -0400 (EDT)”

在我的程序的更大方案中,我需要做的是接收一个 char* 并将其转换为 time_t。以下是我编写的一个简单的测试程序,试图弄清楚 strptime 是否完全考虑了时区,但它似乎不是(当这个测试程序执行时,所有打印的数字都相同,而它们应该不同)。建议?

我还尝试使用 GNU getdate 和 getdate_r,因为这对于可能的灵活格式看起来是一个更好的选择,但是我从编译器收到了“隐式函数声明”警告,暗示我没有包含正确的库。还有什么我应该 #include-ing 来使用 getdate 吗?

#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include <stdio.h>

#ifndef __USE_XOPEN
#define __USE_XOPEN
#endif
#include <time.h>

int main (int argc, char** argv){

char *timestr1, *timestr2, *timestr3;
struct tm time1, time2, time3;
time_t timestamp1, timestamp2, timestamp3;

timestr1 = "Thu, 1 Sep 2011 09:06:03 -0400 (EDT)"; // -4, and with timezone name
timestr2 = "Thu, 1 Sep 2011 09:06:03 -0000"; // -0

strptime(timestr1, "%a, %d %b %Y %H:%M:%S %Z", &time1); //includes UTC offset
strptime(timestr2, "%a, %d %b %Y %H:%M:%S %Z", &time2); //different UTC offset
strptime(timestr1, "%a, %d %b %Y %H:%M:%S", &time3); //ignores UTC offset

time1.tm_isdst = -1;
timestamp1 = mktime(&time1);
time2.tm_isdst = -1;
timestamp2 = mktime(&time2);
time3.tm_isdst = -1;
timestamp3 = mktime(&time3);

printf("Hello \n");
printf("%d\n%d\n%d\n", timestamp1, timestamp2, timestamp3);
printf("Check the numbers \n");
return 0;
}
4

1 回答 1

4

strptime(3)在 MacOS X (10.7.1) 上,手册页中列出的“错误”之一是:

%Z 格式说明符仅接受本地时区的时区缩写或值“GMT”。此限制是由于时区缩写的过载导致的歧义。一个这样的例子是东部标准时间和澳大利亚东部夏令时间的东部标准时间。

前段时间,我写了一对命令——timestamp(1989 年 5 月,1.1 版)和 strptime(2007 年 7 月,1.1 版)。strftime()这些是对和strptime()函数的相对较薄的覆盖。

在 MacOS X 上运行它们,我得到:

$ strptime -T '%Y-%m-%dT%H:%M:%S %Z' 2011-09-08T21:00:00PDT
1315540800 = 2011-09-08T21:00:00PDT
$ timestamp 1315540800
1315540800 = Thu Sep 08 21:00:00 2011
$ timestamp -u 1315540800
1315540800 = Fri Sep 09 04:00:00 2011
$ strptime -T '%Y-%m-%dT%H:%M:%S %Z' 2011-09-08T21:00:00GMT
1315515600 = 2011-09-08T21:00:00GMT
$ timestamp 1315515600
1315515600 = Thu Sep 08 14:00:00 2011
$ timestamp -T '%Y-%m-%dT%H:%M:%S %z' 1315515600
1315515600 = 2011-09-08T14:00:00 -0700
$

我在美国/太平洋(或美国/洛杉矶,或太平洋夏令时间;UTC-07:00),所以这些命令显示的是(如手册页所述),strptime()识别 PDT 和 GMT 并为每个. 指示“打印 UTC(又名 GMT)时间”而不是本地时间的-u选项。timestampUTC 时间晚上 9 点确实是 PDT 下午 2 点。

如果您想要来源,请与我联系 - 请参阅我的个人资料。

于 2011-09-08T05:11:29.860 回答