シンプルに聞こえます。
質問へのコメントに基づいて、サーバーの時刻を修正すると、PHP が正しい時刻を報告します。
サーバーが America/New_York タイムゾーンに設定され、PHP も America/New_York に設定されている場合、つまり、サーバーのオフセットが PHP のオフセットと一致する場合、PHP はサーバーの時刻を出力します。
PHP の date() 関数がタイム サーバーなどから現在の時刻を取得していると想定していた可能性があります。これはそうではありません。
ボーナス
回答の最後の部分を書いた後、NTP タイム サーバーから時間を取得する方法を理解したいと思いました。time.apple.com
<?php
function ntp_time($host) {
// Create a socket and connect to NTP server
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($socket, $host, 123);
// Send request
$msg = "\010" . str_repeat("\0", 47);
socket_send($socket, $msg, strlen($msg), 0);
// Receive response and close socket
socket_recv($socket, $recv, 48, MSG_WAITALL);
socket_close($socket);
// Interpret response
$data = unpack('N12', $recv);
$timestamp = sprintf('%u', $data[9]);
// NTP is number of seconds since 0000 UT on 1 January 1900
// Unix time is seconds since 0000 UT on 1 January 1970
$timestamp -= 2208988800;
return $timestamp;
}
// Get America/New_York time from time.apple.com
date_default_timezone_set('America/New_York');
echo date('Y-m-d H:i:s', ntp_time('time.apple.com'));
//=> 2012-11-25 23:59:02