php:按 UTC 偏移量设置时区

2022-08-30 13:36:17

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

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

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

我收到作为responses:

'Unknown or bad timezone (+2)'

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


答案 1

怎么样...

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

答案 2

你说:

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

您可能运行了类似如下的内容:

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

这将返回 UTC 的当前偏移量(以分钟为单位),正值位于 UTC 以西。它不会返回时区!

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

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

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

另请参阅时区标签 wiki 中的“时区 != 偏移量”。

在您的示例案例中,您可能从 javascript 收到一个值,表示 UTC+3 的当前偏移量。但这只是该特定时间点的偏移量!如果您遵循minaz的答案,您将获得一个时区,该时区假设UTC + 3始终是正确的偏移量。如果实时时区是像“非洲/内罗毕”这样的东西,那么除了UTC + 3之外,它从未使用过任何东西,这将起作用。但据您所知,您的用户可能在“欧洲/伊斯坦布尔”,夏季使用UTC + 3,冬季使用UTC + 2。-180


推荐