我很难找到一种方法来解析时区的字符串,如下所示:" 2011年9月1日星期四09:06:03 -0400(美国东部时间)"
在我的程序的大方案中,我需要做的是接受一个char*并将其转换为time_t。下面是我编写的一个简单的测试程序,它试图弄清楚strptime是否考虑了时区,而它似乎没有(当这个测试程序执行时,所有打印的数字都是相同的,而它们应该不同)。建议吗?
我还尝试使用GNU getdate和getdate_r,因为这看起来像是一个更好的选择,可能灵活的格式,但我得到了一个"隐式函数声明"的警告,从编译器,暗示我没有包括正确的库。还有什么我应该#包括使用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("%dn%dn%dn", timestamp1, timestamp2, timestamp3);
printf("Check the numbers n");
return 0;
}
在MacOS X(10.7.1)上,strptime(3)
手册页中列出的"bug"之一是:
%Z格式说明符只接受本地时区的时区缩写或值"格林尼治时间"。这种限制是由于时区缩写的过载造成的歧义。其中一个例子是EST,它既是东部标准时间又是东澳大利亚夏令时。
前段时间,我写了一对命令—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,并为每个PDT和GMT给出适当的答案。timestamp
的-u
选项表示"打印UTC(又名GMT)时间"而不是本地时间。而UTC时间的晚上9点实际上是PDT时间的下午2点。
联系我,如果你想要的来源-看到我的个人资料。