我遇到了一个非常有趣的问题。我的服务器时区设置为America/New_York(如 中所示phpinfo()
并返回值date_default_timezone_get()
),现在是纽约的 23:30 PM,但使用echo date(h:i)
时显示为 7:30 AM,偏移 8 小时!
我的服务器系统时间也显示为上午 7:30,并且未在 php.ini 中设置默认时区
谢谢你的帮助
听起来很简单。
根据对您问题的评论,修复服务器上的时间,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
我自己发现这篇文章http://abdussamad.com/archives/343-CentOS-Linux:-Setting-timezone-and-synchronizing-time-with-NTP-.html对我来说真的很有用,对我来说效果很好。
正如其他朋友提到的,服务器时间应该与服务器时区进行更正和同步。