c中的strptime与时区偏移

我很难找到一种方法来解析时区,如下所示:“星期四,2011年9月1日09:06:03 -0400(美国东部时间)”

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

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

#include  #include  #include  #include  #ifndef __USE_XOPEN #define __USE_XOPEN #endif #include  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; } 

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

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

前段时间,我写了一对命令 – 时间戳(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 $ 

我在美国/太平洋地区(或America / Los_Angeles,或太平洋夏令时; UTC-07:00),所以这些命令显示的是(如手册页所示), strptime()识别PDT和GMT并给出适当的每个答案。 timestamp-u选项表示’打印UTC(也称为GMT)时间’而不是本地时间。 UTC时间晚上9点确实是PDT下午2点。

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