如何获取从午夜开始的任何状态的时间 hh:mm:ss 而不更改 date_default_timezone_set,无论我处于什么状态

问题描述 投票:0回答:2

由于某种原因,页面顶部的代码中有

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 服务器位于另一个州(我不知道是哪个州,老实说我不在乎)。

那么,在这种情况下如何获取伦敦(或其他州)午夜开始的时间?

php time timezone unix-timestamp iana
2个回答
0
投票

您的函数返回正确的结果,但您的间接检查不太正确。

date('H:i:s', $r)
不包含时区信息,因此使用默认时区(美国/伯利兹)。但是,首先,您使用相对秒数作为绝对 Unix 时间。您基本上以 Unix Epoch 为起点,提取 1970 年 1 月 1 日起的时间并在当前默认时区中打印它。

即使您为此任务临时更改默认时区,伦敦目前正在使用夏令时,因此将会有 1 小时的休息时间。它会在 10 月的最后一个周日之后纯属偶然地工作,并在 3 月再次出现故障。

如果您需要处理不同的时区,请一直使用

DateTime


0
投票
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>";
© www.soinside.com 2019 - 2024. All rights reserved.