php:按UTC偏移量设置时区

she*_*iel 29 php timezone datetime

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

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

$usersNow = new DateTime('now', new DateTimeZone("+3"));
Run Code Online (Sandbox Code Playgroud)

我作为一个respsonse收到:

'Unknown or bad timezone (+2)'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我该怎么办?

min*_*naz 36

这个怎么样...

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

  • 如果PHP处理夏令时,这是错误的**. (10认同)

Mat*_*int 11

你说:

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

你可能会运行这样的东西:

var offset = new Date().getTimezoneOffset();
Run Code Online (Sandbox Code Playgroud)

这将返回UTC 的当前偏移量(以分钟为单位),正值落在UTC以西.它没有返回时区!

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

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

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

另请参阅timezone标记wiki "Time Zone!= Offset" .

在您的示例中,您可能收到了-180来自javascript 的值,表示当前的UTC + 3偏移量.但那只是特定时间点的偏移!如果您按照minaz的答案,您将得到一个时区,假设UTC + 3 始终是正确的偏移量.如果实时区域"Africa/Nairobi"从未使用过除UTC + 3以外的任何东西,那么这将起作用.但是对于所有你知道你的用户可能在的人"Europe/Istanbul",它在夏天使用UTC + 3,在冬天使用UTC + 2.

  • 这个答案值得更多的赞成.@shealtiel面临挑战的详细解释. (4认同)

Wil*_*ken 7

现代答案:

$usersNow = new DateTime('now', new DateTimeZone('+0300'));
Run Code Online (Sandbox Code Playgroud)

文档:

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


Mat*_*hew 5

从PHP 5.5.10开始,DateTimeZone接受类似“ +3”的偏移量:

https://3v4l.org/NUGSv