c 中的 strptime 与时区偏移 [英] strptime in c with timezone offsets

查看:47
本文介绍了c 中的 strptime 与时区偏移的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法找到一种方法来从如下字符串中解析时区:2011 年 9 月 1 日星期四 09:06:03 -0400(美国东部时间)"

I'm having trouble finding a way to parse the timezone out of strings like the following: "Thu, 1 Sep 2011 09:06:03 -0400 (EDT)"

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

What I need to do in the larger scheme of my program is take in a char* and convert it to a time_t. The following is a simple test program I wrote to try and figure out if strptime was accounting for timezone at all, and it doesn't appear to be (when this test program executes all the printed numbers are the same when they should differ). Suggestions?

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

I also tried to use the GNU getdate and getdate_r, because that looks like a better option for possibly flexible formats, but I got a "implicit function declaration" warning from the compiler, implying I wasn't including the correct libraries. Is there something else I should be #include-ing to use 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;
}

推荐答案

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

On MacOS X (10.7.1), one of the 'bugs' listed in the strptime(3) manual page is:

%Z 格式说明符只接受本地时区的时区缩写,或值格林威治标准时间".这种限制是由于时区缩写过载造成的歧义.一个这样的例子是 EST,即东部标准时间和澳大利亚东部夏令时间.

The %Z format specifier only accepts time zone abbreviations of the local time zone, or the value "GMT". This limitation is because of ambiguity due to of the over loading of time zone abbreviations. One such example is EST which is both Eastern Standard Time and Eastern Australia Summer Time.

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

Some time ago, I wrote a pair of commands - timestamp (May 1989 for revision 1.1) and strptime (July 2007 for revision 1.1). These are relatively thin covers over the strftime() and strptime() functions.

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

Running them on MacOS X, I get:

$ 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 并为每个给出适当的答案.-u 选项 timestamp 表示打印 UTC(又名 GMT)时间"而不是本地时间.UTC 时间的晚上 9 点确实是 PDT 的下午 2 点.

I'm in US/Pacific (or America/Los_Angeles, or Pacific Daylight Time; UTC-07:00), so what these commands show is that (as the manual page says), strptime() recognizes PDT and GMT and gives appropriate answers for each. The -u option to timestamp indicates 'print UTC (aka GMT) time' rather than local time. And 9 pm in UTC is indeed 2 pm in PDT.

如果您需要资源,请与我联系 - 请参阅我的个人资料.

Contact me if you would like the source - see my profile.

这篇关于c 中的 strptime 与时区偏移的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆