私はこの質問とそれに対する答えを、特に実際の変化に対処するための、夏時間に対処するための最も確実なガイドにすることを望んでいます。
追加するものがある場合は、実行してください
多くのシステムは正確な時間を保つことに依存しています、問題は夏時間による時間の変更 - 時計を前後に動かすことにあります。
例えば、注文の時間に依存する受注システムにビジネスルールがあります - 時計が変わると、ルールはそれほど明確ではないかもしれません。注文の時間はどのように持続されるべきですか?もちろん無限の数のシナリオがあります - これは単なる実例です。
もっと重要ではないにしても、重要なことです。
私は、プログラミング、OS、データの持続性、およびこの問題の他の関連する側面に興味があります。
一般的な回答は素晴らしいですが、特に1つのプラットフォームでしか利用できない場合にも詳細を確認したいと思います。
Do:
datetimeoffset
型をサポートしている場合があります。1970-01-01T00:00:00Z
(うるう秒を除く)からの秒数です。より高い精度が必要な場合は、代わりにミリ秒を使用してください。この値は、タイムゾーンの調整なしで、常にUTCに基づいている必要があります。DateTimeOffset
よりもDateTime
の方が適している場合が多いことを考慮してください。DateTime
およびDateTimeZone
クラスによって提供されるネイティブタイムゾーン変換を使用します。 DateTimeZone::listAbbreviations()
- 回答を参照 を使用する場合は注意してください。 PHPを最新のOlsonデータで保持するには、定期的にインストールします timezonedb PECLパッケージ; 回答を参照 。>=
、<
)としてクエリします。しない:
America/New_York
などの「タイムゾーン」と-05:00
などの「タイムゾーンオフセット」を混同しないでください。それらは2つの異なるものです。 タイムゾーンタグwiki をご覧ください。Date
オブジェクトを使用して日付と時刻の計算を実行しないでください。 (これはECMAScript 6/2015で修正されました)。テスト:
参照:
timezone
タグwikiページdst
とタグ付けされたStackOverflowの質問timezone
とタグ付けされたStackOverflowの質問その他:
私が上記の答えに何を追加できるのかわかりませんが、ここに私からのいくつかのポイントがあります。
考慮すべき4つの異なる時があります。
歴史的/代替的な時間もあります。彼らは標準時に戻ってマッピングしないかもしれないので、これらは厄介です。例:ユリウス日、土星の太陰暦、クリンゴン暦による日付。
UTCで開始/終了タイムスタンプを保存することはうまくいきます。 1の場合は、イベントタイムゾーン名+イベントと一緒に保存されたオフセットが必要です。 2の場合は、各地域に保存されている現地時間の識別子と、視聴者ごとに保存されている現地のタイムゾーン名+オフセットが必要です(クランチ状態の場合はIPから取得することも可能です)。 3の場合、UTC秒で格納し、タイムゾーンは不要です。 4は、グローバルイベントかローカルイベントかに応じて1または2の特殊なケースですが、timestampに作成)を格納する必要もあるので、このイベントが作成される前後にタイムゾーン定義が変更されたか履歴データを表示する必要がある場合、これは必要です。
上記の例は次のようになります。
サッカーワールドカップ決勝戦は、南アフリカ(UTC + 2 - SAST)の2010年7月11日19:00 UTCに行われました。
この情報により、南アフリカのタイムゾーンの定義が変更された場合でも、2010 WCS決勝が行われた正確な時間を歴史的に判断することができます。andデータベースを照会します。
また、OS、データベース、およびアプリケーションのtzdataファイルを互いに同期させ、世界中の他のファイルと同期させる必要があります。また、アップグレード時に広範囲にテストする必要があります。あなたが依存しているサードパーティのアプリがTZの変更を正しく処理しなかったということは前例のないことではありません。
ハードウェアクロックがUTCに設定されていることを確認し、世界中でサーバーを実行している場合は、それらのOSもUTCを使用するように構成されていることを確認してください。これは、毎時ローテーションされたApacheログファイルを複数のタイムゾーンのサーバーからコピーする必要があるときに明らかになります。ファイル名でソートするのは、すべてのファイルが同じタイムゾーンで命名されている場合にのみ機能します。また、あるボックスから別のボックスに移動してタイムスタンプを比較する必要がある場合は、頭の中で日付の計算をする必要はありません。
また、すべてのボックスでntpdを実行してください。
クライアントマシンから取得したタイムスタンプを有効なものとして信頼しないでください。たとえば、Date:HTTPヘッダー、またはjavascriptのDate.getTime()
呼び出しです。これらは、不透明な識別子として使用される場合、または同じクライアント上で単一のセッション中に日付の計算を行う場合には問題ありませんが、これらの値をサーバー上のものと相互参照しようとしないでください。あなたのクライアントはNTPを実行していません、そして彼らのBIOSクロックのために働くバッテリーを必ずしも持っていないかもしれません。
最後に、政府は時に非常に奇妙なことをするでしょう。
オランダの標準時は、1909年5月1日から1937年6月30日までの法律により、UTCより19分32秒13秒進んでいました。このタイムゾーンは、HH:MM形式を使用して正確に表すことはできません。
わかりました、私はしたと思います。
これは重要で驚くほど大変な問題です。真実は、持続時間のための完全に満足のいく基準がないということです。たとえば、SQL標準とISO形式(ISO 8601)だけでは明らかに不十分です。
概念的な観点からは、通常は2種類の日時データを扱いますが、区別するのが便利です(上記の標準では区別されていません)。 " 物理的時間 "と " 市民時間" "。
「物理的な」瞬間は、物理学が扱う連続的な世界共通の時系列におけるポイントです(もちろん相対性理論を無視して)。たとえば、この概念をUTCで適切にコード化して永続化することができます(うるう秒を無視できる場合)。
ここでの時点は、一連の日時フィールド(Y、M、D、H、MM、S、FS)とTZ(タイムゾーン指定)で完全に指定されます。 (実際には「カレンダー」でもあるが、議論をグレゴリオ暦に限定すると仮定しよう)。タイムゾーンとカレンダーは共同で(原則として)ある表現から別の表現へのマッピングを可能にします。しかし、市民の時間と物理的な時間は基本的に異なる種類の大きさであり、それらは概念的に分離され、異なる方法で扱われるべきです(類推:バイトと文字列の配列)。
私達がこれらのタイプの出来事について交換可能に話しているので、そして市民の時代が政治的変化の影響を受けやすいので、問題は混乱しています。問題(およびこれらの概念を区別する必要性)は、将来のイベントでより明白になります。例(私の議論から取られた ここ )。
Johnは自分のカレンダーに、datetime 2019-Jul-27, 10:30:00
、TZ = Chile/Santiago
(GMT-4のオフセットがあるため、UTC 2019-Jul-27 14:30:00
に対応します)のイベントのリマインダを記録します。しかし、将来的には、国はTZオフセットをGMT-5に変更することにしました。
さて、その日が来たら...そのリマインダーがトリガーされるはずです
A)2019-Jul-27 10:30:00 Chile/Santiago
= UTC time 2019-Jul-27 15:30:00
?
または
B)2019-Jul-27 9:30:00 Chile/Santiago
= UTC time 2019-Jul-27 14:30:00
?
ジョンがカレンダに「2019-Jul-27, 10:30:00 TZ=Chile/Santiago
で電話をかけてください」と言ったときに概念的に何を意味しているのか分からない限り、正しい答えはありません。
彼は「市民の日時」(「私の街の時計が10時30分になったとき」)を意味していましたか?その場合、A)が正解です。
あるいは彼は「物理的な瞬間」、つまり「次の日食が起こるとき」と言う、私たちの宇宙の連続的な時系列におけるポイントを意味したのでしょうか。その場合、答えB)は正しいものです。
いくつかのDate/Time APIがこの区別を正しくしています。それらのうち、 Jodatime は、次の(3番目の)Java DateTime API(JSR 310)の基盤です。
どの階層がユーザーと相互作用するのかを正確に把握し、正規表現(UTC)の日時を変更する必要があることを明確にするために、アーキテクチャ上の懸念を明確に分離します。 非UTCの日時は、(ユーザーのローカルタイムゾーンを次の)プレゼンテーションで、UTC時刻は、(バックエンドおよびミッドティアのためのユニークなまま)モデルです。
また、あなたが奉仕するとどこに行を引くん持っていないもの、あなたの実際の聴衆が何を決めます。あなたが実際にそこに重要な顧客を持っていて、そしてその地域だけのために別のユーザー向けサーバーを考えているのでなければ、エキゾチックなカレンダーに触れないでください。
ユーザーの場所を取得して維持できる場合は、体系的な日時変換に場所を使用します(.NETカルチャまたはSQLテーブルなど)が、ユーザーにとって日時が重要な場合は、エンドユーザーが上書きを選択する方法を提供します。
歴史的な監査の義務がある場合は、(AZでジョーが9月で2歳前に法案を支払ったときに正確に伝えるように)関与そして、(あなたの変換テーブルがAに変更されるレコードの UTCおよび現地時間の両方を保ちます時間のコース)。
バルクにしていたデータのための時間参照タイムゾーンを定義します - などのファイル、Webサービスなどセイ東海岸の会社がカリフォルニア州のデータセンターを持っている - あなたが尋ねると、彼らは1を想定したのではなく、標準として使用しているものを知る必要がありまたは他の。
日時のテキスト表現に埋め込まれたタイムゾーンオフセットを信用してはいけませんし、解析し、それらに従うことを受け入れません。 代わりに、常に明示的にに定義されなければならないという時間帯及び/又は参照ゾーンを要求します。あなたは簡単にPSTオフセットで時間を受け取ることができますがそれはクライアントの参照時間であり、レコードはPSTにあるサーバーでエクスポートされただけなので実際にはESTです。
あなたはOlson tzデータベース について知る必要があります。 ftp://elsie.nci.nih.gov/pub http://iana.org/time-zones/ 。世界中のさまざまな国で、冬と夏(標準および夏時間)を切り替える時期(およびその時期)の直前の変更に対処するために、年に複数回更新されます。 2009年の最後のリリースは2009年代でした。 2010年には2010nでした。 2011年には、2011nでした。 2012年5月末のリリースは2012cでした。 2つの別々のアーカイブ(tzcode20xxy.tar.gzとtzdata20xxy.tar.gz)に、データと実際のタイムゾーンデータ自体を管理するための一連のコードがあることに注意してください。コードもデータもパブリックドメインです。
これは、America/Los_Angelesなどのタイムゾーン名(およびUS/Pacificなどの同義語)のソースです。
異なるゾーンを追跡する必要がある場合は、Olsonデータベースが必要です。他の人がアドバイスしたように、あなたはまたデータが生成されたタイムゾーンの記録と一緒に - UTCが通常選ばれるものである - 固定フォーマットでデータを保存したいです。あなたはその時のUTCからのオフセットとタイムゾーン名を区別したいかもしれません。それは後で違いを生む可能性があります。また、現在2010-03-28T23:47:00-07:00(米国/太平洋地域)であることを知っている場合、2010-11-15T12:30という値の解釈に役立つかどうかわかりません。これはおそらくPSTで指定されています( PDT(太平洋夏時間)ではなく、太平洋標準時)を使用します。
標準Cライブラリインタフェースは、この種のものに関してはそれほど恐ろしくは役に立ちません。
Olsonのデータは、A D Olsonが間もなく引退すること、および著作権侵害のためにメンテナに対して訴訟が起こされたこと(一部は棄却されたため)もあって、動いています。タイムゾーンデータベースは現在、 _ iana _ (インターネット割り当て番号局)の支援の下に管理されています。フロントページには 'タイムゾーンデータベース' へのリンクがあります。ディスカッションメーリングリストは[email protected]
になりました。お知らせリストは[email protected]
です。
一般に、 ローカルタイムオフセット(DSTオフセットを含む)を含みます。 格納されたタイムスタンプにUTCだけでは、後で元のタイムゾーン(およびDST設定)でタイムスタンプを表示する場合は不十分です。
オフセットは常に整数の時間数であるとは限らないことに注意してください(たとえば、インド標準時はUTC + 05:30です)。
例えば、適切なフォーマットはタプル(unix time、minutes in offset)または ISO 8601 です。
「コンピューターの時間」と「人の時間」の境界を越えるのは悪夢です。主なものは、タイムゾーンと夏時間を管理する規則の種類の標準がないということです。各国はいつでも自分のタイムゾーンとDSTルールを自由に変更できます。
一部の国ブラジル、イスラエルは、毎年夏時間を設定します。したがって、DSTがいつ有効になるかを事前に知ることは不可能です。他の人たちはDSTがいつ有効になるかに関して固定(ish)規則を持っています。他の国ではDSTをすべて使用していません。
タイムゾーンは、GMTと1時間の違いである必要はありません。ネパールは+5.45です。 +13のタイムゾーンもあります。つまり、
Sun 23:00 in Howland Island (-12)
MON 11:00 GMT
TUE 00:00 in Tonga (+13)
すべて同じ時間、まだ3つの異なる日です!
タイムゾーンの省略形、およびDSTでの変更の仕方については明確な標準もありません。
AST Arab Standard Time UTC+03
AST Arabian Standard Time UTC+04
AST Arabic Standard Time UTC+03
最善のアドバイスは、できるだけ現地時間を避け、可能な限りUTCに従うことです。可能な限り最後に現地時間に変換してください。
テストの際には、DSTが進行中であってもなくても、DSTを使用していない国(合計6つ)の両方で、西半球および東半球の国々を必ずテストしてください。
PHPの場合
PHP> 5.2のDateTimeZoneクラスは、既に言及しているOlson DBに基づいています。そのため、DBではなくPHPでタイムゾーン変換を行っている場合は、作業の対象外(わかりにくい)Olsonファイル.
ただし、PHPはOlson DBほど頻繁には更新されないため、PHPのタイムゾーン変換を使用しただけでは古いDST情報が残り、データの正確性に影響を及ぼす可能性があります。これは頻繁に起こるとは予想されていませんが、起こる可能性があります。また、世界中に多数のユーザーがいる場合は will が発生します。
上記の問題に対処するには、 timezonedb peclパッケージ を使用します。これは、PHPのタイムゾーンデータを更新するための機能です。このパッケージは更新される頻度でインストールしてください。 (このパッケージのアップデートがOlsonのアップデートに正確に従っているかどうかはわかりませんが、少なくともOlsonのアップデートに非常に近い頻度でアップデートされるようです)。
あなたの設計がそれに適応できるなら、 すべて一緒に現地時間の変換を避けなさい!
私はこれを非常におかしなことに聞こえるかもしれませんが、UXについて考えてみてください。さらに考えてみると、タイムゾーン(およびDST)の精度は日付がnow()
に近いほど重要です。したがって、日付/日付時刻を+/- 1または2週間の相対形式で表すことができれば、残りの時間は短くなります。日付の多くはUTCである可能性があり、それはユーザーの95%にはあまり重要ではありません。
これにより、すべての日付をUTCに格納し、UTCで相対比較を実行して、相対日付しきい値の外側にユーザーUTCの日付を表示することができます。
これはユーザー入力にも当てはまります(しかし一般的にはもっと限られた方法で)。 {昨日、今日、明日、来週の月曜日、来週の木曜日}しかないドロップダウンから選択することは、日付選択よりもユーザーにとって非常に簡単で簡単です。日付ピッカーは、フォーム入力の中で最も痛みを引き起こすコンポーネントの一部です。もちろん、これはすべてのケースでうまくいくわけではありませんが、非常に強力にするには少し巧妙な設計しか必要ないことがわかります。
私はそれを試していませんが、私が説得力があると思うタイムゾーン調整へのアプローチは次のようになります:
すべてをUTCで保存します。
RegionClassId、StartDateTime、およびOffsetMinutes(int、分単位)の3つの列を持つテーブルTZOffsets
を作成します。
テーブルに、ローカル時刻が変更された日時whenとその量のリストを保存します。表内の地域の数と日付の数は、サポートする必要がある日付の範囲と世界の地域によって異なります。日付には実際の限界までの未来が含まれているはずですが、「歴史的」日付であると考えてください。
UTC時間の現地時間を計算する必要がある場合は、次のようにします。
SELECT DATEADD('m', SUM(OffsetMinutes), @inputdatetime) AS LocalDateTime
FROM TZOffsets
WHERE StartDateTime <= @inputdatetime
AND RegionClassId = @RegionClassId;
このテーブルをアプリにキャッシュして、データベースにアクセスするのではなく、LINQまたは同様の手段を使用してクエリを実行することができます。
このデータは パブリックドメインtzデータベース から抽出できます。
このアプローチの利点と脚注:
さて、このアプローチまたは他のの唯一の欠点は、変換fromGMTへの現地時間は完全ではありません。これは、特定の現地時間のクロックrepeatsに対して負のオフセットを持つDSTの変更があるためです。それに対処する簡単な方法はありません、私は恐れています、それは現地時間を保存することはそもそも悪いニュースです。
私はこれを2つのタイプのシステム、「シフト計画システム(例:工場労働者)」と「ガス依存管理システム」に当てはめました…
23時間と25時間の長さの日は対処するのが面倒なので、7時間または9時間かかる8時間シフトもそうです。問題は、あなたがそれぞれの顧客、あるいは顧客の部署が彼らがこれらの特別な場合に何をするかについて彼らが(しばしば文書化せずに)作成した異なった規則を持っているのをあなたが見つけることです。
いくつかの質問は、「既製の」ソフトウェアの支払いが済むまでは顧客に尋ねない方がよいでしょう。ソフトウェアを購入するときにこの種の問題を事前に検討している顧客を見つけることは非常にまれです。
どんな場合でも、UTCで時刻を記録し、日付/時刻を保存する前に現地時間との間で変換する必要があると思います。しかし、特定の時間がどれくらいかかるかを知ることさえ、サマータイムとタイムゾーンでは難しいかもしれません。
Webサイトや他のバックエンドサービスを含む、 server で実行されるアプリケーションに関しては、サーバーのタイムゾーン設定はアプリケーションによって無視されるべきです。
一般的なアドバイスは、サーバーのタイムゾーンをUTCに設定することです。これは確かに良いベストプラクティスですが、他のベストプラクティスに従わないアプリケーションのためのバンドエイドとしてあります。たとえば、サービスがUTCベースのタイムスタンプではなくローカルタイムスタンプを使用してログファイルに書き込みを行っているため、夏時間のフォールバック移行時にあいまいさが生じる可能性があります。サーバーのタイムゾーンをUTCに設定すると、 that applicationが修正されます。しかし、本当の修正は、アプリケーションが最初にUTCを使用してログを記録することです。
Webサイトを含むサーバー側のコードでは、 never サーバーのローカルタイムゾーンを特に指定しないでください。
一部の言語では、ローカルタイムゾーンが簡単にアプリケーションコードに入り込むことがあります。たとえば、.NETのDateTime.ToUniversalTime
メソッドは から に現地時間帯をUTCに変換し、DateTime.Now
プロパティは現地時間帯の現在時刻を返します。また、JavaScriptのDate
コンストラクタはコンピュータのローカルタイムゾーンを使用します。このような他の多くの例があります。コンピューターのローカルタイムゾーン設定を使用するコードを避けて、防御的なプログラミングを実践することが重要です。
デスクトップアプリケーション、モバイルアプリケーション、クライアントサイドJavaScriptなどのクライアントサイドコードのローカルタイムゾーンを使用して予約します。
私は最近、Webアプリケーションで問題を抱えていました。Ajaxポストバックでサーバー側のコードに返される日時が、配信される日時と異なるという問題がありました。
JavaScriptはタイムゾーンと夏時間を調整していたため、ブラウザによっては夏時間をいつ適用するかの計算が行われていたため、クライアントへのポストバックの日付を文字列として作成したクライアントのJavaScriptコードと関係があります。他の人とは違うようでした。
結局、クライアント上の日付と時刻の計算を完全に削除することを選択し、一貫した変換を可能にするためにサーバー上の日付時刻に変換された整数キーでサーバーにポストバックしました。
これからの私の学び:あなたが絶対に必要としない限り、ウェブアプリケーションではJavaScriptの日付と時刻の計算を使用しないでください。
Webの場合、ルールはそれほど複雑ではありません...
あとはサーバーサイドのdatetimeライブラリを使ったUTC /ローカル変換だけです。行ってもいい...
サーバーをUTCに設定したままにし、すべてのサーバーがntpまたは同等のものに設定されていることを確認します。
UTCは夏時間の問題を回避し、同期していないサーバーは診断に時間がかかる予期せぬ結果を引き起こす可能性があります。
FAT32ファイルシステムに保存されているタイムスタンプを扱うときは注意してください - それは常にローカルタイム座標で保持されます(DSTを含みます - msdn記事 を参照)。その上で焼けました。
もう1つは、サーバーに最新の夏時間パッチが適用されていることを確認することです。
UTCベースのシステムを使用していたにもかかわらず、昨年、北米のユーザーの場合、3週間のうち1時間ずつ一貫して時間がずれていました。
結局それはサーバーだったのです。彼らは最新のパッチを適用する必要がありました( Windows Server 2003 )。
DateTimeZone::listAbbreviations()
outputこのPHPメソッドは、(CESTのような)いくつかの '主要な'タイムゾーンを含む連想配列を返します。それは(ヨーロッパ/アムステルダムのような)より具体的な '地理的な'タイムゾーンを含みます。
これらのタイムゾーンとそれらのオフセット/ DST情報を使用している場合は、次のことを認識することが非常に重要です。
各タイムゾーンのすべての異なるオフセット/ DST設定(履歴設定を含む)が含まれるようです。
たとえば、ヨーロッパ/アムステルダムはこの関数の出力で6回見つかります。 1937年までに使用されたアムステルダム時間には、2回の発生(オフセット1172/4772)があります。 2つ(1200/4800)は1937年から1940年の間に使用された期間用です。そして2つ(3600/4800)は1940年以来使用されている時間です。
したがって、この関数によって返されるオフセット/ DST情報に頼ることはできません _は現在正しいものとして使用されています。
特定のタイムゾーンの現在のオフセット/ DSTを知りたい場合は、次のようにする必要があります。
<?php
$now = new DateTime(null, new DateTimeZone('Europe/Amsterdam'));
echo $now->getOffset();
?>
DSTをアクティブにして稼働しているデータベースシステムを維持している場合は、秋の移行中にデータベースシステムを停止する必要があるかどうかを慎重に確認してください。 Mandy DBS(または他のシステムも)は同じ(ローカル)時間を2回渡すのは嫌いです。これはまさにあなたが秋に時計を戻すときに起こることです。 SAPはこれを(私見は本当にきちんとした)回避策で解決しました - 時計を戻すのではなく、内部時計を通常の半分の速度で2時間動かすだけです.
ビジネスルールは常に 市民時間 で動作するようにする必要があります(特に明記されている法律がない限り)。市民時間は混乱であることに注意してください、しかしそれは人々が使うものなのでそれが重要なことです。
内部的には、タイムスタンプをEpochからcivil-time-seconds-from-ofのようなものにしてください。 Epoch は特に重要ではありません( Unix Epoch を好む)が、代替方法よりも物事が簡単になります。 うるう秒 あなたが 本当に それらを必要とする何かをしているのでなければ存在しない(例えば衛星追跡)。タイムスタンプと表示されている時間の間のマッピングは、 _ dst _ 規則が適用される唯一のポイントです。規則は頻繁に(グローバルレベルで、年に数回;政治家のせいで)変更されるので、マッピングをハードコーディングしないように気を付けてください。オルソンの TZデータベース は非常に貴重です。
.NETフレームワーク を使用していますか?もしそうなら、.NET 3.5で追加された DateTimeOffset タイプを紹介しましょう。
この構造体はDateTime
とOffset(TimeSpan
)の両方を保持しています。これはDateTimeOffset
インスタンスの日時と世界協定時刻(UTC)の違いを指定します。
DateTimeOffset.Now
staticメソッドは、(オペレーティングシステムの地域情報で定義されているように)現在の(ローカル)時間とローカルオフセットからなるDateTimeOffset
インスタンスを返します。
DateTimeOffset.UtcNow
静的メソッドは、UTCの現在時刻からなるDateTimeOffset
インスタンスを返します(グリニッジの場合と同じ)。
他の役に立つタイプは TimeZone と TimeZoneInfo クラスです。
.NET でこれに苦しんでいる人のために、DateTimeOffset
やTimeZoneInfo
を使うのがあなたの価値があるかどうかを見てください。
IANA/Olsonタイムゾーン を使用したい場合、または組み込み型があなたのニーズには不十分であると思う場合は、 Noda Time を調べてください。
これが私の経験です: -
(サードパーティのライブラリは必要ありません)
不正確または少なくとも混乱を招く2つのことを指摘したいと思いました。
夏時間の影響を受けない統一された標準に従って常に時間を維持します。 UTCは最も頻繁に言及されているようですが、GMTとUTCは異なる人々によって言及されています。
(ほとんど)すべての実用的なコンピューティング目的のために、UTCは実際にはGMTです。小数秒のタイムスタンプが表示されない限り、GMTを扱っているので、この区別は不要です。
タイムスタンプを格納するときには、現地時間オフセット(DSTオフセットを含む)をそのまま含めます。
タイムスタンプは常にGMTで表されるため、オフセットはありません。
Tom Scottの YouTubeのタイムゾーンに関するビデオ Computerphileチャンネルにも、このトピックに関する素晴らしい説明があります。例は次のとおりです。
のようなコンストラクタだけに頼らないでください。
new DateTime(int year, int month, int day, int hour, int minute, TimeZone timezone)
DSTが原因で特定の日時が存在しない場合、例外が発生する可能性があります。代わりに、そのような日付を作成するための独自の方法を構築してください。その中で、DSTが原因で発生した例外をすべてキャッチし、遷移オフセットを使用して必要な時間を調整します。 DSTは、タイムゾーンに応じて、さまざまな日付およびさまざまな時間に(ブラジルでは真夜中にも)発生する可能性があります。
実際、kernel32.dllはSystemTimeToTzSpecificLocationをエクスポートしません。ただし、SystemTimeToTzSpecificLocalTimeとTzSpecificLocalTimeToSystemTimeの2つはエクスポートされます。
処理時間が説明されている非常に混乱であることを証明するためのほんの一例です。このページのいくつかの箇所でうるう秒は無視されています。
数年前、AndroidオペレーティングシステムはUTCの時間基準を取得するためにGPS衛星を使用していましたが、GPS衛星がうるう秒を使用しないという事実を無視していました。 Appleの電話ユーザーとAndroidの電話ユーザーが約15秒離れてカウントダウンをした大晦日に混乱が生じるまで、だれも気づかなかった。
私はそれがそれ以来修正されたと思います、しかし、あなたはこれらの「マイナーな詳細」があなたを悩ませるためにいつ戻ってくるかについて決して知りません。
struct tm
があります。1 struct tm
のいくつかの実装はUTCオフセットを格納しますが、これは標準にしませんでした。