gmdate()とdate()の両方は、タイムスタンプを読み取り可能なタイム文字列にフォーマットできますが、重要な違いが1つあります。
GMDATE()はグリニッジ標準時間(GMT/UTC)に基づいており、タイムゾーンオフセットを考慮していません。
date()は、 PHP (またはdate_default_timezone_set()によって設定されたタイムゾーン)で構成されたデフォルトのタイムゾーンに従って時間をフォーマットします。
例えば:
echo gmdate('Y-m-d H:i:s', time()); // 出力:2025-05-25 08:00:00(UTC時間)
echo date('Y-m-d H:i:s', time()); // 出力:2025-05-25 16:00:00(タイムゾーンがあると仮定します Asia/Shanghai)
一部の企業では、特にMultivental Business Systemsで、タイムゾーン時間とUTC時間の間に正確な変換を行う必要があります。ここでは、UTCを使用してデータを均一に保存し、現地時間に表示します。現時点では、 GMDATE()と日付()の調整が特に重要になります。
ユーザーが「2025-05-25 16:00:00」に入ると仮定すると、ストレージのためにUTCタイムスタンプに変換する必要があります。
date_default_timezone_set('Asia/Shanghai');
$local_time = '2025-05-25 16:00:00';
$timestamp = strtotime($local_time); // 本地時間的時間戳
$utc_time = gmdate('Y-m-d H:i:s', $timestamp);
echo $utc_time; // 出力:2025-05-25 08:00:00
このUTC時間をAPIに送信する必要がある場合:
$url = 'https://gitbox.net/api/sync?time=' . urlencode($utc_time);
データベースから読み取られた時間がUTC形式であると仮定すると、ユーザーが配置されているタイムゾーンとして時間を表示したいと思います。
date_default_timezone_set('Asia/Shanghai');
$utc_timestamp = strtotime('2025-05-25 08:00:00');
$local_time = date('Y-m-d H:i:s', $utc_timestamp);
echo $local_time; // 出力:2025-05-25 16:00:00
この方法は、ログ表示、タイムラインディスプレイ、その他の機能に適しています。
分散システムを開発すると、 gmdate()を使用して、すべてのタイムデータの一貫性を確保できます。たとえば、サーバーログのロギング:
$log = '[' . gmdate('Y-m-d H:i:s') . '] Task started' . PHP_EOL;
file_put_contents('/var/logs/task.log', $log, FILE_APPEND);
すべてのサーバーは、それらが存在するタイムゾーンに関係なく整列することができます。
特定の1日のUTCゼロポイントタイムスタンプを取得する必要がある場合(一般的に統計タスクに使用されます):
date_default_timezone_set('UTC');
$timestamp = strtotime('2025-05-25 00:00:00');
echo $timestamp; // 出力:1748131200
APIリクエストを作成する場合:
$url = 'https://gitbox.net/report?start=' . $timestamp;
現在のタイムゾーン設定を常に明確にし、 Date_Default_TimeZone_Get()を使用して、現在のタイムゾーンを表示します。
gmdate()とdate()を使用する前に、ターゲット時間のセマンティクスについて明確にする必要があります。ユーザーの現地時間ですか、それともシステムの統一時間ですか?
ユーザー可視時間にdate()を使用し、システムの内部ストレージまたは同期にgmdate()を使用することをお勧めします。