php:根据UTC偏移量设置时区



使用javascript,我知道我的用户时区是UTC +3。

现在我想用这个知识创建DateTime对象:

$usersNow = new DateTime('now', new DateTimeZone("+3"));

我收到一个响应:

'Unknown or bad timezone (+2)'

我做错了什么?我该如何修复?

这个怎么样?

$original = new DateTime("now", new DateTimeZone('UTC'));
$timezoneName = timezone_name_from_abbr("", 3*3600, false);
$modified = $original->setTimezone(new DateTimezone($timezoneName));

你说:

使用javascript,我知道我的用户时区是UTC +3。

你可能运行了这样的代码:

var offset = new Date().getTimezoneOffset();

以分钟为单位返回当前与UTC的偏移量,正值落在UTC以西。返回时区!

时区不是偏移量。时区具有偏移量。它可以有多个不同的偏移。通常有两个偏移,一个用于标准时间,一个用于夏令时。单个数值不能单独表示。

  • 时区示例:"America/New_York"
    • 对应的标准偏移量:UTC-5
    • 对应的日光偏移量:UTC-4

除了两个偏移量之外,在该时区中还包含了两个偏移量之间转换的日期和时间,以便您知道它们何时适用。还有一个关于偏移和过渡如何随时间变化的历史记录。

参见时区标签wiki中的"Time Zone != Offset"。

在您的示例中,您可能从javascript接收到-180的值,表示当前 UTC+3的偏移量。但这只是特定时间点的偏移量!如果你遵循minaz的答案,你将得到一个时区,它假设UTC+3是总是正确的偏移量。如果真正的时区是像"Africa/Nairobi"这样的东西,它从来没有使用过UTC+3以外的任何东西,那就可以工作了。但是你知道你的用户可能在"Europe/Istanbul",它在夏天使用UTC+3,在冬天使用UTC+2。

现代答案:

$usersNow = new DateTime('now', new DateTimeZone('+0300'));

文档:

http://php.net/manual/en/datetimezone.construct.php

从PHP 5.5.10开始,DateTimeZone接受像"+3"这样的偏移量:

https://3v4l.org/NUGSv

这个将Matthew的答案更进一步,将日期的时区更改为任意整数偏移量。

public static function applyHourOffset(DateTime $dateTime, int $hourOffset):DateTime
{
    $dateWithTimezone = clone $dateTime;
    $sign = $hourOffset < 0 ? '-' : '+';
    $timezone = new DateTimeZone($sign . abs($hourOffset));
    $dateWithTimezone->setTimezone($timezone);
    return $dateWithTimezone;
}

注意:由于接受的答案,我在生产中出现了中断。

据我所知,从文档上的DateTimeZone,您需要传递一个有效的时区,下面是有效的时区。看看其他的,也许能帮到你。

DateTimeZone需要一个时区而不是偏移

你试过了吗

http://php.net/manual/en/function.strtotime.php

 <?php
    echo strtotime("now"), "n";
    echo strtotime("10 September 2000"), "n";
     echo strtotime("+5 hours");
    echo strtotime("+1 day"), "n";
    echo strtotime("+1 week"), "n";
    echo strtotime("+1 week 2 days 4 hours 2 seconds"), "n";
    echo strtotime("next Thursday"), "n";
    echo strtotime("last Monday"), "n";
    ?>

对于遇到这种情况的任何人,我都面临着同样的问题,所以最后我扩展了DateTime类并覆盖了__construct()方法以接受偏移量(以分钟为单位)而不是时区。

从那里,我的自定义__construct()计算出以小时和分钟为单位的偏移量(例如-660 = +11:00),然后使用parent::__construct()将我的日期(自定义格式化以包含我的偏移量)传递回原始DateTime。

因为我总是在应用程序中处理UTC时间,所以我的类也通过减去偏移量来修改UTC时间,因此传递Midnight UTC和偏移量-660将显示11am

我的解决方案详细如下:https://stackoverflow.com/a/35916440/2301484

多亏了Joey Rivera的链接,我找到了一个解决方案。就像其他人在这里所说的,时区不是一个偏移量,您需要一个有效的时区。

这是我自己使用的

$singapore_time = new DateTime("now", new DateTimeZone('Asia/Singapore'));

var_dump( $singapore_time );

我自己发现使用YYYY-MM-DD HH:MM格式要方便得多。例子。

$original = new DateTime("2017-05-29 13:14", new DateTimeZone('Asia/Singapore'));

相关内容

  • 没有找到相关文章

最新更新