显示错误时间的php日期函数
我遇到了一个非常有趣的问题。我的服务器时区设置为美国/纽约(如显示错误时间的php日期函数,php,timezone,Php,Timezone,我遇到了一个非常有趣的问题。我的服务器时区设置为美国/纽约(如phpinfo()和date\u default\u timezone\u get()的返回值所示),现在纽约是晚上23:30,但当使用回显日期(h:i)时,它会显示我上午7:30,偏移8小时 我的服务器系统时间也显示为上午7:30,php.ini中未设置默认时区 谢谢你的帮助听起来很简单 根据对问题的评论,确定服务器上的时间,PHP将报告正确的时间 如果您的服务器设置为America/New_York时区,并且PHP也设置为Amer
phpinfo()
和date\u default\u timezone\u get()
的返回值所示),现在纽约是晚上23:30,但当使用回显日期(h:i)
时,它会显示我上午7:30,偏移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
听起来很简单
根据对问题的评论,确定服务器上的时间,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
我自己发现这篇文章在我的情况下非常有用,对我来说效果很好
正如其他朋友提到的,服务器时间应该被更正并与服务器时区同步。我自己发现这篇文章对我的情况非常有用,对我来说效果很好
正如其他朋友提到的,服务器时间应该被更正并与服务器时区同步。当你在终端中执行date
时会发生什么?你是否可能更改了时区,但没有更新服务器的实际时间?@TheSmose:我说它也显示上午7:30,第二个问题是什么意思?我从未修改过我的服务器时间和时区您的计算机认为它在哪个时区,它实际上在哪个时区?@ali如果您的服务器认为它在纽约时区,并给出上午7:30,那么为什么PHP不应该设置正确的服务器时间?@ali在终端中执行date
时会发生什么?你是否可能更改了时区,但没有更新服务器的实际时间?@TheSmose:我说它也显示上午7:30,第二个问题是什么意思?我从未修改过我的服务器时间和时区您的计算机认为它在哪个时区,它实际上在哪个时区?@ali如果您的服务器认为它在纽约时区,并给出上午7:30的时间,那么为什么PHP不应该?@ali设置正确的服务器时间。好的,我的服务器操作系统是centOS。你能告诉我怎么做吗?+1是的,这是服务器配置过程中的常见问题。好的,我的服务器操作系统是centOS。你能告诉我怎么做吗?+1是的,这是服务器配置过程中的常见问题。