谁能告诉我 DateTimeZone::getOffset PHP 函数是如何工作的?

Can someone tell me how the DateTimeZone::getOffset PHP function works?

我得到了这行代码:

echo (new DateTimeZone('UTC'))->getOffset(new DateTime('now', new DateTimeZone('America/New_York')));

它 return 为零。但我预计它 return UTCAmerica/New_York 时区之间的差异。

然后我两次提供相同的时区:

echo (new DateTimeZone('America/New_York'))->getOffset(new DateTime('now', new DateTimeZone('America/New_York')));

我预计它会 return 零,因为时区相同。但现在 returns -18000(这是 America/New_YorkUTC 之间的偏移量)。

documentation 中,它表示 getOffset() 始终 return 是 GMT (=UTC) 的偏移量。但是为什么 getOffset 不是静态的呢?如果它总是相对于 GMT 的偏移量,为什么第一个构造函数中的时区起作用?

我知道 DateTime class 中还有一个 getOffset 方法,比较好用。但我想了解 getOffset 方法在 DateTimeZone class 中的工作原理。

时区的偏移量是它与 UTC 相差多少小时。根据 DST 生效和失效的时间,时区的偏移量可能会在全年发生变化。所以你不能像那样得到时区的偏移量,因为它不是一个常量值。您只能询问一个时区在给定时间它相对于 UTC 的偏移量 这就是您将 DateTime 对象传递给 getOffset 的目的:询问时区给定时间的偏移值是多少。例如:

echo (new DateTimeZone('America/New_York'))->getOffset(new DateTime), PHP_EOL;
echo (new DateTimeZone('America/New_York'))->getOffset(new DateTime('+6 months'));
-18000
-14400

如果你想得到两个任意时区之间的偏移差,你得到它们各自的UTC偏移量并减去它们。

我来这里是为了寻找一种方法来获取 PHP 当前默认时区与 UTC 之间的时差。我用 DateTimeZone::getOffset 进入了兔子洞,但事实证明有一个更简单的方法:

$offset = date('O');
// Returns a string like '-0400' 

$offset = date('P');
// Returns a string like '-04:00' 

$offset = date('Z');
// Returns the offset in seconds, e.g. '-14400'

需要说明的是,这得到了现在 的任何时区偏移量,但我想这是大多数时候所需要的。

您可以使用 date_default_timezone_set() 切换 PHP 的当前时区。

https://www.php.net/manual/en/datetime.format.php