少しの間、あなたは世界の人々を危険から守ることに人生を捧げた国際行動スパイのふりをしてみましょう。 あなたは次のミッションを受け取ります:
こんにちは、エージェント アイリス、
バハマでの休暇を中断して申し訳ありませんが、ロンドンのエージェントから、ロサンゼルスの人口密集地域で「時限爆弾」が爆発する予定であるとの連絡を受けました。 私たちの情報筋によると、「時限爆弾」は今日の午後 3 時 14 分に発動する予定です。
急いで、人々はあなたを頼りにしています!
あなたは急いで立ち上がり、ロサンゼルスに向かう準備をしましたが、重要な情報が欠けていることにすぐに気づきました。 「時限爆弾」はバハマ時間の午後 3 時 14 分に発動しますか、それともロサンゼルス時間の午後 3 時 14 分に発動しますか? ...あるいはロンドン時間の午後 3 時 14 分かもしれません。
あなたは、指定された時刻 (午後 3 時 14 分) では、いつロサンゼルスに着く必要があるかを判断するのに十分な情報が得られないことにすぐに気づきました。
あなたに提供された時刻 (午後 3 時 14 分) は 曖昧です。 正確な時間を判断するには、さらに詳しい情報が必要です。
この問題についてよく考えてみると、与えられた時間の曖昧さを克服する方法があることに気付きます。
情報源からは、現地時間が午後 3 時 14 分である場所が提供されている可能性があります。 たとえば、ロサンゼルス、バハマ、ロンドンなどです。
ソースは、合意された場所 (グリニッジ、ロンドンなど) からのオフセットを提供するために、UTC (協定世界時) などの標準を使用している可能性があります。
あなたは情報源に電話し、提供された時刻が確かにロサンゼルス時間の午後 3 時 14 分であることを確認しました。 ロサンゼルスに旅行し、午後 3 時 14 分までに「時限爆弾」を解除し、すぐにバハマに戻って休暇を終えることができます。
それでは、この思考演習には何の意味があるのでしょうか? 上記の問題に遭遇する人はいないでしょうが、データをある場所から別の場所に移動するアプリケーションやコードを使用する場合 (特に場所が異なるタイムゾーンにある場合)、注意する必要があります。 日時とタイムゾーンの処理方法について説明します。
そうですね、タイムゾーンはそれほど悪くありません。 夏時間と政治的境界によりタイムゾーンが難しくなります。
私はタイムゾーンの「一般的な」考え方を常に理解しているつもりでした。つまり、地球はタイムゾーンごとに垂直のスライスに分割されており、各タイムゾーンは東のタイムゾーンより1時間遅れています。
この単純化は多くの場所に当てはまりますが、残念ながら、このルールには多くの例外があります。
参考:世界のタイムゾーン(Wikipedia)
特定の時刻を伝える言語を簡素化するために、世界は UTC (協定世界時) を使用することに落ち着きました。 この標準では、「原点」をロンドンのグリニッジを通過する経度 0 度に設定します。
UTC を基準として使用し、他のすべてのタイムゾーンは UTC を基準にして定義できます。 この関係は、UTC オフセット と呼ばれます。
現地時間とオフセットがあれば、(上記のスパイの例に見られるように) あいまいな時間はなくなります。曖昧さのない、明確かつ具体的な時間があります。
UTC オフセットを表示するために使用される一般的な形式は、±HHMM[SS[.ffffff]] です。
たとえば、アメリカでは、東部標準ザイム ゾーン (EST) は -0500 UTC と定義されています。 これは、EST のすべての場所が UTC より 5 時間遅れていることを意味します。 時間が UTC で午後 9 時である場合、EST の現地時間は午後 4 時です。
オーストラリア中部西部標準タイムゾーン (ACWST) では、オフセットは 0845 UTC として定義されます。 時間が UTC で午前 1:00 の場合、ACWST の現地時間は午前 9:45 です。
それでは、上のタイムゾーンマップに戻りましょう。 この画像から、多くのタイム ゾーンが国や地域の政治的境界に従っていることがわかります。 これにより、タイムゾーンの計算が少し複雑になりますが、理解するのに十分簡単です。
残念ながら、時間とタイムゾーンを扱う際に考慮すべき要素がもう 1 つあります。
ロサンゼルスを見てみましょう。
地図上では、ロサンゼルスの UTC オフセットは 標準時 で -8 です。 通常、冬の間は標準時が使用されますが、夏の間は通常 夏時間 が使用されます。
夏時間 (DST) は、特定のタイムゾーンの時計を進めます (通常、夏の間は 1 時間進みます)。 政治的地域が DST に従うことを選択する理由はいくつかあります (エネルギーの節約、日光の有効利用など)。 サマータイムの難しさと複雑さは、DST が世界中で一貫して遵守されていないことです。 お住まいの地域によっては、DST が適用される場合と適用されない場合があります。
政治的境界線と夏時間の組み合わせにより、特定の時刻を決定する複雑さが大幅に増すため、現地時刻を UTC を基準とした特定の時刻に正しくマッピングするには、タイム ゾーン データベースが必要です。 Internet Assigned Numbers Authority (IANA) タイム ゾーン データベースは、オペレーティング システムやプログラミング言語で使用されるタイム ゾーン情報の共通ソースです。
データベースには、すべてのタイム ゾーンの名前とエイリアス、オフセットに関する情報、夏時間の使用に関する情報、タイム ゾーンの略語、およびさまざまなルールが適用される日付範囲が含まれます。
タイムゾーンデータベースのコピーと情報は、IANA の Web サイトでご覧いただけます。
ほとんどの UNIX システムには、オペレーティング システムのパッケージ マネージャー (通常は /usr/share/zoneinfo にインストールされます) で更新されるデータベースのコピーがあります。 一部のプログラミング言語にはデータベースが組み込まれています。 ライブラリによって利用可能にしたり、データベースのシステムのコピーを読み取ることができるものもあります。
タイムゾーンデータベースには、特定のタイムゾーンの多くの名前とエイリアスが含まれています。 エントリの多くには、名前に国 (または大陸) と主要都市が含まれています。 例:
これで、次のことがわかりました。
これを知った上で、ObjectScript で日時/タイム ゾーンをどのように操作すればよいでしょうか?
***注: ObjectScript に関して次の記述はすべて正しいと思いますが、ObjectScript がタイム ゾーンとオフセットでどのように機能するかについて間違った記述があった場合はお知らせください。
IRIS を実行しているプロセスのシステム タイム ゾーン内で、さまざまな形式の間でタイムスタンプを変換する必要がある場合は、ObjectScript の組み込み機能で十分です。 以下は、ObjectScript のさまざまな時間関連の変数/関数の簡単なリストです:
$ZTIMESTAMP / $ZTS
$NOW(tzmins)
$ホロログ
$ZTIMEZONE
$ZDATETIME() / $ZDT()
$ZDATETIMEH() / $ZDTH()
私が知る限り、これらの関数はローカル システムのタイム ゾーンを使用して日時を操作することしかできません。 ObjectScript で任意のタイムゾーンを操作する方法はないようです。
任意のタイム ゾーンとの間の変換に対応するために、tz (ObjectScript タイム ゾーン変換ライブラリ) の作成に取り組みました。
このライブラリは、システムにインストールされているタイム ゾーン データベースにアクセスして、タイム ゾーンと形式の間でタイムスタンプを変換するためのサポートを提供します。
たとえば、ロサンゼルス (アメリカ/ロサンゼルス) の現地時間がある場合は、バハマで使用されているタイムゾーン (アメリカ/ニューヨーク) またはロンドンで使用されているタイムゾーン (ヨーロッパ/ロンドン) に変換できます。
USER>zw ##class(tz.Ens).TZ("2024-12-20 3:14 PM", "America/Los_Angeles", "America/New_York") "2024-12-20 06:14 PM" USER>zw ##class(tz.Ens).TZ("2024-12-20 3:14 PM", "America/Los_Angeles", "Europe/London") "2024-12-20 11:14 PM"
オフセット付きのタイムスタンプが与えられている場合は、元のタイムゾーンが分からない場合でも、それをオーストラリアのユークラ (オーストラリア/ユークラ) の現地時間に変換できます。
USER>zw ##class(tz.Ens).TZ("2024-12-20 08:00 PM -0500", "Australia/Eucla") "2024-12-21 09:45 AM +0845"
HL7 メッセージを扱う場合、tz ライブラリには相互運用性ルールと DTL に公開されたメソッドがいくつかあり、タイムゾーン、現地時間、オフセットのある時間などを簡単に変換できます。
// Convert local time from one time zone to another set datetime = "20240102033045" set newDatetime = ##class(tz.Ens).TZ(datetime,"America/New_York","America/Chicago") // Convert local time to offset set datetime = "20240102033045" set newDatetime = ##class(tz.Ens).TZOffset(datetime,"America/Chicago","America/New_York") // Convert offset to local time set datetime = "20240102033045-0500" set newDatetime = ##class(tz.Ens).TZLocal(datetime,"America/Chicago") // Convert to a non-HL7 format set datetime = "20240102033045-0500" set newDatetime = ##class(tz.Ens).TZ(datetime,"America/Chicago",,"%m/%d/%Y %H:%M:%S %z")
タイムゾーン、夏時間、世界地図、そして「時限爆弾」に遭遇したこの「国際旅」をフォローしていただき、ありがとうございます。 これにより、日時とタイム ゾーンの操作の複雑さの多くが明らかになり、簡素化できれば幸いです。
tz - ObjectScript タイム ゾーン変換ライブラリをチェックして、ご質問 (または私の発言に対する修正/説明) があればお知らせください。
ありがとうございます!
以上がタイムゾーンとオフセットとObjectScript、なんと!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。