一尘不染

您如何解释新\ DateTime('0000-00-00 00:00:00')的结果?

php

这是一个测试代码:

<?php

ini_set('date.timezone', 'Europe/London');    
$dt = new \DateTime('0000-00-00 00:00:00');

var_dump($dt);

提供:

object(DateTime)[1]
  public 'date' => string '-0001-11-30 00:00:00' (length=20)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/London' (length=13)

但这不是一个有效的日期。我不了解返回的值,尤其是月份……您能解释一下吗?


阅读 348

收藏
2020-05-29

共1个答案

一尘不染

您在这里看到两种效果。第一个是您使用一种可以以多种形式书写的日期书写方式:

0000-01-01 same as  0000-01-01
0000-01-00 same as -0001-12-31
0000-00-01 same as -0001-12-01
0000-00-00 same as -0001-11-30

因此,根据日期本身,您已经指定了11月30日-1。

现在剩下的时间偏移大约为9分21秒。这是因为与1911年3月10日当地时间发生的巴黎/法国UTC相比,时钟发生了变化。


我稍微修改了您的代码示例,并根据需要介绍了 Europe / Paris
设置,它发挥了作用。这段代码还说明Z了您要查找的与UTC()的偏移量(以秒为单位):

$dt = new DateTime('0000-00-00 00:00:00', new DateTimeZone('Europe/Paris'));
printf("%s secs offset from UTC\n", $dt->format('r T (e) Z'));

我改变了一下日期

Fri, 10 Mar 1911 23:51:38 +0009 PMT (Europe/Paris) 561 secs offset from UTC
                                                   ^^^

一秒钟后:

Fri, 10 Mar 1911 23:51:39 +0000 WET (Europe/Paris) 0 secs offset from UTC

当当地标准时间即将到达1911年3月11日星期六时,将00:01:00时钟倒转到1911年3月10日(星期五)当地时间23:51:39。

2020-05-29