PHPでの時間関連操作を処理する場合、2つの関数date()とgmdate()を使用することがよくあります。それらの最大の違いは、タイムゾーン処理です。日付()は、デフォルトのタイムゾーン(または設定タイムゾーン)に基づいて時間を出力し、 GMDATE()はグリニッジ標準時間(GMT)に出力されます。
したがって、多くの開発者は、 gmdate()関数を使用する場合、非常に一般的な問題に遭遇します。出力時間と予想される現地時間の間に偏差があります。この記事では、このバイアスが発生する理由を詳細に説明し、出力時間をよりよく制御するのに役立ついくつかのソリューションを提供します。
簡単な例を見てみましょう。
<code> echo gmdate( "ymd h:i:s"、time()); </code>このコードは、現在のGMT時間(つまり、タイムゾーン0の時間)を出力します。これは、ローカルで見られる時間から8時間の最大偏差(東8番目の地区など)になります。
予想される出力時間が特定のタイムゾーン(UTC+8、北京時間など)に基づいている場合、 GMDATE()を使用することは明らかに不適切です。
GMDATE()の目的は、「GMTタイムスタンプをフォーマットする」ことです。つまり、どのタイムゾーンがサーバーによって設定されていても、 gmdate()はそれを無視し、標準時間のみを出力します。これにより、クロスタイムゾーンを扱ったり、国際システムをドッキングしたりする場合に非常に便利になります。しかし、毎日の開発では、現地時間が必要な場合は、 gmdate()を使用すると問題が発生しやすくなります。
これは最も直接的で効果的な方法です。
<code> date_default_timezone_set( 'asia/shanghai');エコー日付( "ymd h:i:s"、time()); </code>この方法は、最初にグローバルなデフォルトタイムゾーンを設定し、次に日付()を使用して、タイムゾーンに一致する時間を出力します。この方法は、現地時間のみを必要とするほとんどのプロジェクトに適しています。
特別なニーズがある場合は、 gmdate()を使用する必要があります(サードパーティのGMT APIを使用してドッキングなど)。タイムゾーンオフセットを手動で追加できます。
<code> $ timestamp = time() + 8 * 3600; // gmt+8 echo gmdate( "ymd h:i:s"、$ timestamp); </code>このアプローチは、単純ですが、「ハードコーディングされた」タイムオフセットであるため、マルチタイムゾーンでサポートされるシステムでは推奨されません。
PHPのDateTimeクラスは、より強力な時間処理機能を提供し、タイムゾーンの正確な制御を可能にします。
<Code> $ dt = new DateTime( "Now"、new DateTimeZone( "Asia/Shanghai")); echo $ dt-> format( "ymd h:i:s"); </code>または、タイムゾーンに転向する前にUTCを使用して処理する必要がある場合:
<Code> $ dt = new DateTime( "@"。Time()); $ dt-> setimezone(new DateTimeZone( "Asia/Shanghai")); echo $ dt-> format( "ymd h:i:s"); </code>この方法は、明確で保守可能であるだけでなく、マルチタイムゾーンシステムへの拡張にも便利です。
gmdate()は、標準時間を出力するように設計されているため、 date_default_timezone_set()の設定を決して考慮しません。
サーバーが海外に展開されている場合、デフォルトのタイムゾーンが必要なものではない場合があります。プログラムの入り口にタイムゾーンを均一に設定してください。
ユーザー時間の表示に関しては、 DateTimeを使用してユーザーのタイムゾーンの設定を記録してみてください。
タイムゾーンの偏差は、システムのローカルタイムゾーン設定を無視するため、 GMDATE()を使用したタイムスタンプ出力に遭遇したときに発生します。現地時間を出力する場合は、 date_default_timezone_set()でdate()を使用するか、 DateTimeクラスを使用してタイムゾーンの出力を制御することをお勧めします。 GMTの時間出力が必要な場合を除き、ほとんどのビジネスシナリオでgmdate()を使用することは適切ではありません。
この記事が、PHPでの時間逸脱の問題を完全に解決できることを願っています。 PHP時間処理の詳細については、次のようにアクセスできます。
<code> https://gitbox.net/php-time-wandling </code>