在几分钟内找到时区的午夜[PHP]

时间:2014-07-13 00:18:40

标签: php datetime timestamp-with-timezone

我在几分钟内存储了UTC的偏移量:例如-240

我试图找到当前日期午夜对应的特定偏移量的UNIX时间戳。

我在类似这样的问题中找到了类似的信息:How do I get the UTC time of "midnight" for a given timezone?

但是,我没有城市名称/时区管辖权,只有一分钟的抵消。我认为这应该没问题,因为出于我的目的,我不需要考虑夏令时,它可能会在一小时后关闭,但仍然没问题。

实施例

抵消:-420

2014年12月7日午夜:1405148400(unix TS)

使用UTC,我必须首先判断它是否是TZ的第二天或同一天,因为它可能有一个不同的"最后一个午夜"。

3 个答案:

答案 0 :(得分:1)

虽然这个解决方案看起来有点难看但它确实做了我认为你要求的!此示例使用-180分钟作为偏移量。

date_default_timezone_set('UTC');

// Work out which day the time zone is in
$day = strtotime('-180 minutes');

// Strip of the time part of the day, to give UTC midnight on the correct day
$utcMidnight = strtotime('midnight', $day);

// Now apply the offset in reverse to give the zone's midnight
$zoneMidnight = strtotime('+180 minutes', $utcMidnight);

答案 1 :(得分:0)

您可以使用date_default_timezone_set使所有与时间相关的功能确认转变。首先要做的是将这些分钟转换为小时,因为n和n + 1之间的UTC差距为1小时。

$hours = $minutes / 60;

我还建议您先检查分钟值:

if($minutes % 60 == 0) // We're good.

现在,如果要将UTC偏移转换为时区,可以创建函数:

<?php
function offsetToTimezone($offset){
    $timezones = array( 
        "-12" => "Pacific/Kwajalein", 
        "-11" => "Pacific/Samoa", 
        "-10" => "Pacific/Honolulu", 
        "-9" => "America/Juneau", 
        "-8" => "America/Los_Angeles", 
        "-7" => "America/Denver", 
        "-6" => "America/Mexico_City", 
        "-5" => "America/New_York", 
        "-4" => "America/Caracas", 
        "-3.5" => "America/St_Johns", 
        "-3" => "America/Argentina/Buenos_Aires", 
        "-2" => "Atlantic/Azores",
        "-1" => "Atlantic/Azores", 
        "0" => "Europe/London", 
        "1" => "Europe/Paris", 
        "2" => "Europe/Helsinki", 
        "3" => "Europe/Moscow", 
        "3.5" => "Asia/Tehran", 
        "4" => "Asia/Baku", 
        "4.5" => "Asia/Kabul", 
        "5" => "Asia/Karachi", 
        "5.5" => "Asia/Calcutta", 
        "6" => "Asia/Colombo", 
        "7" => "Asia/Bangkok", 
        "8" => "Asia/Singapore", 
        "9" => "Asia/Tokyo", 
        "9.5" => "Australia/Darwin", 
        "10" => "Pacific/Guam", 
        "11" => "Asia/Magadan", 
        "12" => "Asia/Kamchatka" 
    );

    return $timezones[$offset];
}
?>

...并使用if进行转换:

date_default_timezone_set(offsetToTimezone($hours));

顺便说一下,我建议您查看this answer,它为您提供了一种更优雅的方式来实现offsetToTimezone的工作。

现在你的脚本如果在正确的时区配置,只需要一个时间戳:

$timestamp = mktime(0, 0, 0);

如果在某个时候,您需要将时区重置为默认值,则可能需要date_default_timezone_get来保存它:

$timezone = date_default_timezone_get();
// Change to another timezone based on your offset.
// Get your timestamp.
date_default_timezone_set($timezone);

答案 2 :(得分:0)

我不得不仔细思考,但我认为这是我正在寻找的解决方案。如果您认为此算法不正确,请与我们联系。

function getLastMidnightForOffset( $minuteOffset ) {
    $today = mktime( 0, 0, 0 );
    $tomorrow = $today + 86400;
    $yesterday = $today - 86400;
    $offset = $minuteOffset * 60;

    if ( time() + $offset >= $tomorrow ) {
        $localMidnight = $tomorrow - $offset;
    } elseif ( time() + $offset >= $today ) {
        $localMidnight = $today - $offset;
    } else {
        $localMidnight = $yesterday - $offset;
    }

    return $localMidnight;
}