5

次のような文字列からタイムゾーンを解析する方法を見つけるのに苦労しています: "Thu, 1 Sep 2011 09:06:03 -0400 (EDT)"

私のプログラムのより大きなスキームで行う必要があるのは、char* を取り込んで time_t に変換することです。以下は、strptime がタイムゾーンをまったく考慮しているかどうかを確認するために私が書いた簡単なテスト プログラムです。実際にはそうではないようです (このテスト プログラムを実行すると、出力されたすべての数値は異なるはずなのに同じになります)。提案?

GNU getdate と getdate_r も使用しようとしましたが、それはおそらく柔軟な形式のより良いオプションのように見えるためですが、コンパイラから「暗黙の関数宣言」警告が表示され、正しいライブラリが含まれていなかったことを意味します。getdate を使用するために #include する必要があるものは他にありますか?

#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

MacOS X (10.7.1) では、strptime(3)マニュアル ページに記載されている「バグ」の 1 つが次のとおりです。

%Z 形式指定子は、ローカル タイム ゾーンのタイム ゾーンの略語、または値「GMT」のみを受け入れます。この制限は、タイム ゾーンの略語のオーバーロードによるあいまいさが原因です。そのような例の 1 つが EST で、これは東部標準時と東部オーストラリア夏時間の両方です。

少し前に、timestamp (リビジョン 1.1 の場合は 1989 年 5 月) と strptime (リビジョン 1.1 の場合は 2007 年 7 月) の 2 つのコマンドを書きました。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) 時間」を示すオプション-utimestampUTC の午後 9 時は、PDT の午後 2 時です。

ソースが必要な場合は、私に連絡してください - 私のプロフィールを見てください。

于 2011-09-08T05:11:29.860 に答える