ホームページ  >  記事  >  バックエンド開発  >  PHP: タイムゾーンを理解する

PHP: タイムゾーンを理解する

王林
王林オリジナル
2024-08-06 03:40:41669ブラウズ

PHP: Understanding Time Zones

プログラミングにおいてタイムゾーンを扱うのは難しい場合があります。

PHP は Web 向けであるため、言語は Web をサポートしています。なぜ気にする必要があるのか​​見てみましょう。

なぜタイムゾーンを気にするのでしょうか?

タイムゾーンを気にしないと、遅かれ早かれバグが発生します。

時間関連の機能 (スケジュールされたイベントなど) が失敗する可能性があります。夏時間のような難しい概念を扱わなければならない場合、事態はさらに悪化します。

これらの概念は電子商取引にとって不可欠です:

  • 製品の在庫状況
  • 割引
  • 送料

どんなバグも最終的にはビジネスに損害を与えます。

PHP でタイムゾーンを始める

最も基本的でありながら強力な実装は次のようになります。

$timeZone = new DateTimeZone('Europe/Berlin');
$date = new DateTime('now', $timeZone);

echo $date->format('Y-m-d H:i:s');

組み込みの DateTime クラスは、DateTimeZone オブジェクトを 2 番目の引数として受け取ります。これは、$date オブジェクトのその後の操作に影響します。

正しいタイムゾーンを見つけるには、DateTimeZone::listIdentifiers() またはこのリンクを使用できます。

タイムゾーン間の時差

DateTime は、日付に対して一般的な操作を実行するためのさまざまなヘルパーを提供します。時差は非常に基本的なものですが、タイムゾーンが異なるとどうなりますか?

$dateTimeNY = new DateTime('2024-08-02 01:01:01', new DateTimeZone('America/New_York'));
$dateTimeBerlin = new DateTime('2024-08-02 07:01:01', new DateTimeZone('Europe/Berlin'));
$interval = $dateTimeNY->diff($dateTimeBerlin);
print_r($interval);// 0 everywhere

タイムゾーン「America/New_York」と「Europe/Berlin」がないと、PHP は $dateTimeNY と $dateTimeBerlin がデフォルトで同じタイムゾーンであると想定するため、別の差分 (6 時間) が得られます。

ここでは明白に見えるかもしれませんが、アプリがその情報を正しく取得しない場合、悪い結果が生じる可能性があります。

「常に」UTC を使用してください

PHP ではデフォルトのタイムゾーンに特定の値を設定できますが、特に管理するタイムゾーンが異なる場合は、通常は UTC を使用することをお勧めします。

UTC は「Unix エポック」を指し、ユニバーサル形式です。

99.9% の確率で、日付を UTC で保存することをお勧めします。

こうすることで、一貫性を保つことができます。

これらのデータを操作するには、PHP の組み込みヘルパーとコンバータを使用する必要がありますが、保存されているすべてのデータは同じ発信元 (1970 年 1 月 1 日 00:00:00 UTC) のみを参照することに注意してください。

比較や並べ替えなどの一般的な操作が簡単になります。そうしないと、同じように見えても、暗黙的に同じベースライン上にない値が得られる可能性があります。

GMT と UTC の比較

GMT はグリニッジ標準時を意味し、かつてはタイムゾーンの基礎でした。

技術的に言えば、UTC と GMT は同じ時刻を示します。ただし、UTC の方が正確で (原子時計)、より一貫性があります (夏時間はありません)。

UTC とは異なり、GMT はタイムゾーンです。各タイムゾーンで GMT+0 から時間を加算または減算する実際の動作を見たことがあるかもしれません。

これらは両方とも非常に似た目的のための時間標準ですが、UTC の方が洗練されています。

さまざまな情報源によると、「UTC」と略されているのは、そうでなければ英語 (「協定世界時」) で「CUT」、フランス語 (「Temps Universel Coordonné」) で「TUC」となるためです。

「ズールー語」とは何ですか?

ズールー語は、主に軍事および航空関連で使用される標準時間です。

「ズールー語」は「経度のゼロ子午線」を意味し、GMT と全く同じですが、軍隊や飛行士は文字の代わりに表音文字を使用します。

これは (UTC とは異なり) 重要な概念ではありませんが、知っておくと良いでしょう。実際にその形式が必要な場合、PHP はそれをサポートしています。

Y-m-d\TH:i:sp

時間は変わる可能性がある

「タイムゾーン」の概念は人間のみを対象とし、機械やプログラムは考慮しません。

政府は「時間設定」を変更できます。たとえば、UTC オフセットや DST (夏時間) の遵守状況は異なる場合があります。

他にも多くのイベントが世界時間に影響を与える可能性があります。プログラミングでタイムゾーンを扱うために、ユニバーサル形式 UTC と標準化されたコンバータを使用するもう 1 つの十分な理由があります。

炭素とタイムゾーン

Carbon は、ネイティブ DateTime オブジェクトの上に構築されたヘルパーのセットです。

その結果、Carbon はタイムゾーンをサポートします:

$tomorrow = Carbon::now()->tomorrow()->tz('Europe/Berlin');

Laravel などのフレームワークを使用している場合は、Carbon パッケージがすでにインストールされています。

夏時間の管理方法

夏時間または夏時間 (DST) は、多くのアプリにとって重要な概念です。

一言で言えば、人々は日光をより有効に利用するために時計を変更します。

これは、通常、夏は日照時間が長いために起こります(どこでもというわけではありません)。だからこそ、人々は時計を進め、日照時間が再び短くなる秋に時計を戻すのです。

言い換えれば、DST は日の出と日の入りの時刻に関連しており、世界中で大きく異なる可能性があります。

getTransitions():
を使用してこれらのバリエーションを取得できます。

$timezone = new DateTimeZone('Europe/Berlin');
$transitions = $timezone->getTransitions();
print_r($transitions);

Known bugs in PHP

If you use the latest version of PHP, you will not get this specific bug, but your case can be a known issue.

Read reported bugs and issues, as it might prevent some headaches.

Useful links

  • What time is it?
  • PHP doc - Time zones
  • PHP doc - getTransitions()
  • Daylight Time
  • PHP engineer - time zones
  • Military time

以上がPHP: タイムゾーンを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。