はC

2016-08-30 1 views
3

を使用してのstrftimeを使用してタイムゾーン()を省略ガイドIはSOで、this、及びthisを見てきたが、それらは、同じ問題の非Cの変動に対処します。はC

火8月30日14時55分08秒:私はこの時間文字列を取得しています

int main(void) 
{ 
    time_t rawtime; 
    struct tm *info; 
    char timeStr[80]; 

    time(&rawtime); 
    info = localtime(&rawtime); 

    strftime(timeStr,80,"%a %b %d %H:%M:%S %Z %Y", info); 

    printf("%s", timeStr); 
    getchar(); 

    return 0; 
} 

:次のコードでGNU GCCコンパイラ(Windowsのコード::ブロック)を用いて

太平洋夏時間2016

タイムゾーン以外のものはすべて問題ありません。私は見つけることができますのstrftime()ごとのmanページでは8月30日夜02時55分08秒PDT 2016

火、またはWindowsのドキュメント:私のような、それは省略することを好みます書式指定子%Zの説明は、次のようになります。タイムゾーン名または略称。 (eg. here

短縮するタイムゾーンの書式を設定するトリックは何ですか?

+0

「グリニッジ標準時」*は「GMT」に略してありますが、「GMTDT」は表示されません。 –

+0

Microsoftは、[strftime() '](https://msdn.microsoft.com/en-us/library/aa272978(v=60).aspx)について何を見てきましたか?コンパイラは、Microsoft Cランタイムライブラリまたは他のいくつかのCランタイムライブラリを使用してビルドするように構成されていますか? –

+0

@WeatherVane - LOL、良い点。私は使用しているデバイスのタイムスタンプがOSのようなLinuxを使用しているのを見ています。これは短縮されたタイムゾーンを持っています。実装固有のものでしょうか? – ryyker

答えて

4

strftimeは、フルネームか略称かを保証しません。実装に依存します。 C99の仕様(and Microsoft's documentation)は言う:

% Zはタイムゾーンが決定できない場合は、ロケールのタイムゾーン名または省略形、またはなしの文字に置き換えられます。

AFAIK AFAIKでは、タイムゾーンの省略形を保証する標準的なC方法はありません。これは、システムタイムゾーンデータベースを使用することを前提としています。あなたはship with your own copy of the time zone databaseでした。

一般に、タイムゾーンの略語はあいまいであるため、悪い考えです。 Skim the list我々は、ACT、AMT、BST、ECT、GST、IST、LHST、MST、PST、およびSSTがすべてあいまいであることを発見する。フルネーム、数値オフセット(つまり、%z)を使用する方が良い場合や、タイムゾーンを避けてUTCを使用する方がよい場合があります(特にロギングに便利です)。

+1

"AFAIK標準のC言語の方法はありません。そのとおりです。 Windowsでは、UnixやLinux、Arthur David Olsonのタイムゾーンコード(MacOSを含む)をベースにした他のシステムのフルネームが得られます。これは省略形を取得しており、どちらか一方を求める方法はありません。 –

+0

@SteveSummit - 私は答えでこれをクリックしたでしょう。これは、strftime()のタイムゾーン動作に関する明快な声明で、会話に(そして私の理解に)追加されます。ありがとうございました。 – ryyker

2

私は最近、同じことが必要であり、良い答えがないと判断しました。私は、 "東部標準時間"のようなWindowsのタイムゾーン文字列を "EST"にマップするためのいくつかの強力なコードを書いたが、これは悪いアイデアであり、(b)私の翻訳リストは決して完璧ではないことを知っていた。