Dでエポック時間(UNIXタイムスタンプ)を標準時間に変換するにはどうすればよいですか? フォーマットをカスタマイズする方法はありますか?
2 に答える
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_t
time_t
フォーマットをカスタマイズする方法はありますか?
時間を表す文字列にユーザー定義の形式を提供する方法を探しているということですか (C のようにstrftime
)? std.datetime にはまだありません。API は、そのために設計する必要があります。いくつかの議論が行われましたが、まだ解決されていません。したがって、最終的には実現しますが、しばらくかかる可能性があります。
その間、ISO 形式、ISO 拡張形式、および Boost の単純な文字列形式をそれぞれ使用する 、toISOString
、toISOExtString
およびがあります。toSimpleString
一般的に、 を使用することをお勧めしtoISOExtString
ます。これは、人間と標準の両方が簡単に読み取れるためです。またsysTime.toUTC()
、他のコンピュータと通信するときは (人間のために印刷するのではなく) UTC (例: ) に入れるのが一般的に最善LocalTime
です。これは、タイム ゾーンを追加しない とは異なり、タイム ゾーンがその一部であるためです。
std.datetime に関するこの記事をまだ読んでいない場合は、読むことをお勧めします。モジュールの概要と使用方法がよくわかるからです。