由于某种原因,我的代码在页面顶部有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 纪元为起点,提取 1970 年 1 月 1 日的时间,并在当前默认时区中打印它。伯利兹的 Unix 纪元甚至没有在午夜附近发生,因此打印的时间偏离了轨道。即使您临时更改此任务的默认时区,伦敦目前仍使用夏令时,因此会差 1 小时。 10 月的最后一个星期日之后,它纯属偶然地可以正常工作,但 3 月又会再次出现故障。
如果您需要处理不同的时区,请
DateTime
一直使用。