由于某种原因,页面顶部的代码中有
date_default_timezone_set('America/Belize');
,我不想更改它。
为了获取从午夜(或任何其他时区)开始的当前伦敦秒数,无论我处于什么状态,我尝试使用 StackOverflow 上找到的一个小函数(只是稍微修改一下):
function seconds_from_midnight($iana_timezone = 'Europe/London'){
$time_now = time(); //UNIX TIMESTAMP (IT'S THE SAME EVERYWHERE)
$date = new DateTime();
$date->setTimestamp( $time_now );
$date->setTimezone(new DateTimeZone($iana_timezone));
$date->modify('today midnight');
$midnight_time = $date->getTimestamp();
$seconds_since_midnight = $time_now - $midnight_time;
return $seconds_since_midnight;
}
我认为第一部分是正确的,因为它使用unix时间戳(从1970年开始的UTC-0)。
然后我检查伦敦的时间(这部分完全错误):
$r = seconds_from_midnight();
echo 'Time London now: '.date('H:i:s', $r).'<br>'; //How to do this for each state?
[如果你是伦敦人现在看时钟,这应该是正确的时间]
现在看看出现的问题:
date
它指的是服务器,所以给了我一个错误的时间(我不知道为什么,但我认为它在页面开头的date_default_timezone_set
的原因,我不想改变)。
请注意:变量
$iana_timezone
给出的时区可能与Europe/London
不同。
我不住在美国/伯利兹,PHP 服务器位于另一个州(我不知道是哪个州,老实说我不在乎)。
那么,在这种情况下如何获取伦敦(或其他州)午夜开始的时间?
您的函数返回正确的结果,但您的间接检查不太正确。
date('H:i:s', $r)
不包含时区信息,因此使用默认时区(美国/伯利兹)。但是,首先,您使用相对秒数作为绝对 Unix 时间。您基本上以 Unix Epoch 为起点,提取 1970 年 1 月 1 日起的时间并在当前默认时区中打印它。
即使您为此任务临时更改默认时区,伦敦目前正在使用夏令时,因此将会有 1 小时的休息时间。它会在 10 月的最后一个周日之后纯属偶然地工作,并在 3 月再次出现故障。
如果您需要处理不同的时区,请一直使用
DateTime
。
function seconds_from_midnight($iana_timezone = 'Europe/London') {
$time_now = time();
$date = new DateTime();
$date->setTimestamp($time_now);
$date->setTimezone(new DateTimeZone($iana_timezone));
$midnight = clone $date;
$midnight->setTime(0, 0, 0); // Midnight (00:00:00)
$seconds_since_midnight = $date->getTimestamp() - $midnight->getTimestamp();
return $seconds_since_midnight;
}
$seconds = seconds_from_midnight('Europe/London');
echo "Seconds from midnight in London: " . $seconds . "<br>";