4

Dでエポック時間(UNIXタイムスタンプ)を標準時間に変換するにはどうすればよいですか? フォーマットをカスタマイズする方法はありますか?

4

2 に答える 2

4

2 つのまったく異なる質問を同時に行うのではなく、質問を分離する必要があります。

Dでエポック時間(UNIXタイムスタンプ)を標準時間に変換するにはどうすればよいですか?

UNIX 時間からSysTimeの「std 時間」に変換する必要がある場合は、次を使用しますunixTimeToStdTime

assert(unixTimeToStdTime(0) == (Date(1970, 1, 1) - Date.init).total!"hnsecs");

そのため、 を実行すると、UTC で 1970 年 1 月 1 日の真夜中 (つまり、エポック時間) の時点でローカル タイム ゾーンのSysTime(unixTimeToStdTime(0))が取得されます。SysTime他のSysTimeコンストラクターとは異なり、指定された時間を、指定されたタイムゾーンにあるものとして扱いません。むしろ、指定された値に設定するだけでstdTime、指定された値になりtimezoneます。したがって、他のコンストラクターと同一のものを構築するにSysTimeは、次のようにします。

auto epochInLocalTime = SysTime(Date(1970, 1, 1), UTC()).toLocalTime();

反対方向に変換する場合はstdTimeToUnixTime、std 時間を unix 時間に変換します。ただし、それをSysTime持っtoUnixTimeているので、通常は必要ありませんstdTimeToUnixTime

time_t epoch = epochInLocalTime.toUnixTime();

ただし、注意すべきことの 1 つは、std.datetime が真に UNIX 時間を処理し、time_t常に UTC であると見なされるという事実です。これが重要な理由は、何らかの不可解な理由で、Windows が現地時間の DST を適用しtime_tて UTC オフセットが変更されないようにするためです。を使用するすべての Microsoft の関数で動作します。time_t彼らはそのナンセンスを期待しているためです。time_ttime_t

フォーマットをカスタマイズする方法はありますか?

時間を表す文字列にユーザー定義の形式を提供する方法を探しているということですか (C のようにstrftime)? std.datetime にはまだありません。API は、そのために設計する必要があります。いくつかの議論が行われましたが、まだ解決されていません。したがって、最終的には実現しますが、しばらくかかる可能性があります。

その間、ISO 形式、ISO 拡張形式、および Boost の単純な文字列形式をそれぞれ使用する 、toISOStringtoISOExtStringおよびがあります。toSimpleString一般的に、 を使用することをお勧めしtoISOExtStringます。これは、人間と標準の両方が簡単に読み取れるためです。またsysTime.toUTC()、他のコンピュータと通信するときは (人間のために印刷するのではなく) UTC (例: ) に入れるのが一般的に最善LocalTimeです。これは、タイム ゾーンを追加しない とは異なり、タイム ゾーンがその一部であるためです。

std.datetime に関するこの記事をまだ読んでいない場合は、読むことをお勧めします。モジュールの概要と使用方法がよくわかるからです。

于 2013-02-15T23:50:31.547 に答える