1

我遇到了一个非常有趣的问题。我的服务器时区设置为America/New_York(如 中所示phpinfo()并返回值date_default_timezone_get()),现在是纽约的 23:30 PM,但使用echo date(h:i)时显示为 7:30 AM,偏移 8 小时!

我的服务器系统时间也显示为上午 7:30,并且未在 php.ini 中设置默认时区

谢谢你的帮助

4

2 回答 2

4

听起来很简单。

根据对您问题的评论,修复服务器上的时间,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
于 2012-11-26T04:53:23.113 回答
0

我自己发现这篇文章http://abdussamad.com/archives/343-CentOS-Linux:-Setting-timezone-and-synchronizing-time-with-NTP-.html对我来说真的很有用,对我来说效果很好。

正如其他朋友提到的,服务器时间应该与服务器时区进行更正和同步。

于 2012-11-26T05:27:48.620 回答