ホームページ > バックエンド開発 > Python チュートリアル > タイムゾーンとオフセットとObjectScript、なんと!

タイムゾーンとオフセットとObjectScript、なんと!

Patricia Arquette
リリース: 2025-01-01 13:06:13
オリジナル
785 人が閲覧しました

あなたの使命

少しの間、あなたは世界の人々を危険から守ることに人生を捧げた国際行動スパイのふりをしてみましょう。 あなたは次のミッションを受け取ります:

こんにちは、エージェント アイリス、

バハマでの休暇を中断して申し訳ありませんが、ロンドンのエージェントから、ロサンゼルスの人口密集地域で「時限爆弾」が爆発する予定であるとの連絡を受けました。 私たちの情報筋によると、「時限爆弾」は今日の午後 3 時 14 分に発動する予定です。

急いで、人々はあなたを頼りにしています!

問題

あなたは急いで立ち上がり、ロサンゼルスに向かう準備をしましたが、重要な情報が欠けていることにすぐに気づきました。 「時限爆弾」はバハマ時間の午後 3 時 14 分に発動しますか、それともロサンゼルス時間の午後 3 時 14 分に発動しますか? ...あるいはロンドン時間の午後 3 時 14 分かもしれません。

あなたは、指定された時刻 (午後 3 時 14 分) では、いつロサンゼルスに着く必要があるかを判断するのに十分な情報が得られないことにすぐに気づきました。

あなたに提供された時刻 (午後 3 時 14 分) は 曖昧です正確な時間を判断するには、さらに詳しい情報が必要です。

いくつかの解決策

この問題についてよく考えてみると、与えられた時間の曖昧さを克服する方法があることに気付きます。

  1. 情報源からは、現地時間が午後 3 時 14 分である場所が提供されている可能性があります。 たとえば、ロサンゼルス、バハマ、ロンドンなどです。

  2. ソースは、合意された場所 (グリニッジ、ロンドンなど) からのオフセットを提供するために、UTC (協定世界時) などの標準を使用している可能性があります。

ハッピーエンド

あなたは情報源に電話し、提供された時刻が確かにロサンゼルス時間の午後 3 時 14 分であることを確認しました。 ロサンゼルスに旅行し、午後 3 時 14 分までに「時限爆弾」を解除し、すぐにバハマに戻って休暇を終えることができます。

ポイント

それでは、この思考演習には何の意味があるのでしょうか? 上記の問題に遭遇する人はいないでしょうが、データをある場所から別の場所に移動するアプリケーションやコードを使用する場合 (特に場所が異なるタイムゾーンにある場合)、注意する必要があります。 日時とタイムゾーンの処理方法について説明します。

タイムゾーンは難しいです!

そうですね、タイムゾーンはそれほど悪くありません。 夏時間と政治的境界によりタイムゾーンが難しくなります。

私はタイムゾーンの「一般的な」考え方を常に理解しているつもりでした。つまり、地球はタイムゾーンごとに垂直のスライスに分割されており、各タイムゾーンは東のタイムゾーンより1時間遅れています。

Time Zones and Offsets and ObjectScript, Oh My!

この単純化は多くの場所に当てはまりますが、残念ながら、このルールには多くの例外があります。

Time Zones and Offsets and ObjectScript, Oh My!
参考:世界のタイムゾーン(Wikipedia)

UTC (「オリジン」) での標準化

特定の時刻を伝える言語を簡素化するために、世界は UTC (協定世界時) を使用することに落ち着きました。 この標準では、「原点」をロンドンのグリニッジを通過する経度 0 度に設定します。

「オフセット」の定義

UTC を基準として使用し、他のすべてのタイムゾーンは UTC を基準にして定義できます。 この関係は、UTC オフセット と呼ばれます。

現地時間とオフセットがあれば、(上記のスパイの例に見られるように) あいまいな時間はなくなります。曖昧さのない、明確かつ具体的な時間があります。

UTC オフセットを表示するために使用される一般的な形式は、±HHMM[SS[.ffffff]] です。

  • マイナス記号は、UTC の西へのオフセットを示します。
  • プラス記号は、UTC の東へのオフセットを示します。
  • HH は時間を示します (ゼロ埋め)
  • MM は分を示します (ゼロ埋め)
  • 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 を使用した変換と書式設定

これで、次のことがわかりました。

  • 現地時間 (オフセットや場所のない曖昧な時間)
  • UTC オフセット (タイムスタンプまたは場所の、ロンドンのグリニッジの UTC "原点" からの相対オフセット)
  • 夏時間 (タイムゾーンのオフセットを犠牲にして文明を助ける試み)
  • タイムゾーンデータベース (多くの場所や地域のタイムゾーンと夏時間の遵守に関する情報が含まれます)

これを知った上で、ObjectScript で日時/タイム ゾーンをどのように操作すればよいでしょうか?

***注: ObjectScript に関して次の記述はすべて正しいと思いますが、ObjectScript がタイム ゾーンとオフセットでどのように機能するかについて間違った記述があった場合はお知らせください。

組み込み変数と関数

IRIS を実行しているプロセスのシステム タイム ゾーン内で、さまざまな形式の間でタイムスタンプを変換する必要がある場合は、ObjectScript の組み込み機能で十分です。 以下は、ObjectScript のさまざまな時間関連の変数/関数の簡単なリストです:

  • $ZTIMESTAMP / $ZTS

    • UTC 値としての IRIS 内部形式 (オフセット 0000)。
    • 形式: ddddd,sssss.fffffff
  • $NOW(tzmins)

    • UTC から指定された tzmins オフセットを使用した現在のシステム現地時間。
    • 夏時間は考慮されません。
    • デフォルトでは、tzmins は $ZTIMEZONE 変数に基づいています。
    • 形式: ddddd,sssss.fffffff
  • $ホロログ

    • 夏時間を考慮した現在のシステム現地時間 ($ZTIMEZONE に基づく)。
    • 形式: ddddd,sssss.fffffff
  • $ZTIMEZONE

    • システムのローカル UTC オフセットを分単位で返すか、設定します。
  • $ZDATETIME() / $ZDT()

    • $HOROLOG 形式を特定の表示形式に変換します。
    • システムの現地時間から UTC (0000) に変換するために使用できます。
  • $ZDATETIMEH() / $ZDTH()

    • 日時文字列を内部 $HOROLOG 形式に変換します。
    • UTC (0000) からシステムの現地時間への変換に使用できます。

私が知る限り、これらの関数はローカル システムのタイム ゾーンを使用して日時を操作することしかできません。 ObjectScript で任意のタイムゾーンを操作する方法はないようです。

Open Exchange の tz Library に入る

任意のタイム ゾーンとの間の変換に対応するために、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 タイム ゾーン変換ライブラリをチェックして、ご質問 (または私の発言に対する修正/説明) があればお知らせください。

ありがとうございます!

参考文献/興味深いリンク

  • https://en.wikipedia.org/wiki/Coowned_Universal_Time
  • https://en.wikipedia.org/wiki/Time_zone
  • https://en.wikipedia.org/wiki/Daylight_ Saving_time
  • https://www.worldtimeserver.com/learn/unusual-time-zones/
  • https://www.worldtimeserver.com/learn/history-of-time-zones/
  • https://www.worldtimeserver.com/learn/what-is-a-time-zone/
  • https://en.wikipedia.org/wiki/Tz_database
  • https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  • https://en.wikipedia.org/wiki/Internet_Assigned_Numbers_Authority
  • https://www.iana.org/time-zones
  • https://www.gnu.org/software/libc/manual/html_node/Calendar-Time.html

以上がタイムゾーンとオフセットとObjectScript、なんと!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート