首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在PHP的DateTime中启用对跃秒的完全UTC支持?

如何在PHP的DateTime中启用对跃秒的完全UTC支持?
EN

Stack Overflow用户
提问于 2013-01-08 02:32:13
回答 2查看 1.4K关注 0票数 5

我想用闰秒做一些闰秒计算,但是它很早就停止了,因为我不能告诉DateTime我的意思:

代码语言:javascript
运行
复制
### June 30, 2012 at 23:59:60 UTC ###

$leap = new DateTime('2012-06-30T23:59:60UTC');
var_export($leap);

输出:

代码语言:javascript
运行
复制
DateTime::__set_state(array(
   'date' => '2012-07-01 00:00:00',
   'timezone_type' => 3,
   'timezone' => 'UTC',
))

我无法为去年的UTC闰秒(也不是我尝试过的其他闰秒)创建一个DateTime。我想知道DateTime是否支持闰秒,我认为它支持UTC,但可能不支持闰秒,所以只支持GMT?

EN

回答 2

Stack Overflow用户

发布于 2013-01-08 03:53:48

UNIX时间对闰秒一无所知。就它而言,每一天都有86,400秒,而时间只是偶尔跳过或重复一秒钟。(这在很大程度上是必要的,因为闰秒没有提前完全排定。如果在UNIX时计算闰秒,那么UNIX时代和人类可读的日期/时间之间的“映射”将随着闰秒的公布而发生不可预测的变化。)

因为它的日期/时间原语都是基于UNIX时间的,所以PHP也不能很容易地表示闰秒。它们实际上是看不见的。

票数 3
EN

Stack Overflow用户

发布于 2013-01-08 03:30:19

这不是一个完全的答案,但至少它是一些东西。

这里有两个可能的问题:

  1. 正如ircmaxell所提到的,PHP可能会在时区操作位内的某个地方吃闰秒,但还需要更多的研究。
  2. 不过,我个人认为PHP正在“修复”秒到分钟的“溢出”。DateTime构造函数通过处理strtotime的相同代码传递给定的参数,这是众所周知的,它采用完全虚假的日期(例如,2月31日),并将它们转换成某种可能有意义的东西。

文档中对闰秒的唯一引用是在strptime中。

"tm_sec"包括任何闰秒(目前每年最多2次)。

例如,缩写自PHP交互式提示符:

代码语言:javascript
运行
复制
php > $eviler_format = '%Y-%m-%d %H:%M:%S %z';
php > $evil = '2012-12-31 23:59:59 +0000';
php > var_dump(strptime($evil, $eviler_format));
array(9) {
  'tm_sec' =>
  int(59) // ...
}
php > $evil = '2012-12-31 23:59:60 +0000';
php > var_dump(strptime($evil, $eviler_format));
array(9) {
  'tm_sec' =>
  int(60) // ...
}
php > $evil = '2012-12-31 23:59:61 +0000';
php > var_dump(strptime($evil, $eviler_format));
array(9) {
  'tm_sec' =>
  int(61) // ...
}
php > $evil = '2012-12-31 23:59:62 +0000';
php > var_dump(strptime($evil, $eviler_format));
bool(false)

不幸的是,它也需要一些不是12月31日的“闰秒”:

代码语言:javascript
运行
复制
php > $evil = '2012-01-07 23:59:61 +0000';
php > var_dump(strptime($evil, $eviler_format));
array(9) {
  'tm_sec' =>
  int(61)
  'tm_min' =>
  int(59)
  'tm_hour' =>
  int(23)
  'tm_mday' =>
  int(7)
  'tm_mon' =>
  int(0)
  'tm_year' =>
  int(112)
  'tm_wday' =>
  int(6)
  'tm_yday' =>
  int(6)
  'unparsed' =>
  string(0) ""
}

或者不在午夜:

代码语言:javascript
运行
复制
php > $evil = '2012-01-07 08:59:61 +0000';
php > var_dump(strptime($evil, $eviler_format));
array(9) {
  'tm_sec' =>
  int(61)
  'tm_min' =>
  int(59)
  'tm_hour' =>
  int(8)
  'tm_mday' =>
  int(7)
  'tm_mon' =>
  int(0)
  'tm_year' =>
  int(112)
  'tm_wday' =>
  int(6)
  'tm_yday' =>
  int(6)
  'unparsed' =>
  string(0) ""
}

而且,它完全是一个表示函数,不以任何方式附加到DateTime上。你不能在上面做数学,考虑到事情的本质,从现实生活中获得真正的飞跃秒是不可能的。这里没用。

结论: PHP不考虑闰秒。确保您的服务器与关心它的上游NTP服务器同步,您最终会没事的。如果您需要关注关于闰秒的二级准确性,PHP可能是错误的语言。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14207371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档