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

Alt*_*PHP 25 php datetime date

这是一个测试代码:

<?php

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

var_dump($dt);
Run Code Online (Sandbox Code Playgroud)

这提供:

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)
Run Code Online (Sandbox Code Playgroud)

而这不是有效日期.我不明白返回的价值,特别是月份......你能解释一下吗?

hak*_*kre 29

你在这里看到两种效果.第一个是您使用一种写作方式来创建可以多种形式编写的日期:

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
Run Code Online (Sandbox Code Playgroud)

所以到了日期本身,你已经指定了11月30日-1.

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


我稍微修改了你的代码示例并引入了欧洲/巴黎设置,它正在发挥作用.这段代码也告诉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'));
Run Code Online (Sandbox Code Playgroud)

我稍微改变了日期

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

一秒后:

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

当地标准时间即将到达1911年3月11日星期六时,00:01:00时钟倒退0:09:21到星期五,即1911年3月10日,当地标准时间23:51:39.

那是561秒.参考:巴黎的时钟变化 - 1911年的时间变更日期以及1900年至1924年之间的时区变化和夏令时开始/结束日期.


Kai*_*aii 6

看起来错误处理DateTime不完整.通常,其他PHP函数将'0000-00-00'作为错误处理(无效日期).

DateTime应遵循相同的准则,但事实并非如此.此代码不会抛出异常,即使它应该:

try { $dt = new \DateTime('0000-00-00 00:00:00'); } 
catch (Exception $e) { var_dump($e); }
var_dump($dt); 
/* result:
object(DateTime)#1 (3) {
  ["date"]=>
  string(20) "-0001-11-30 00:00:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
*/
Run Code Online (Sandbox Code Playgroud)

其他函数会将该输入视为错误:

var_dump(strtotime('0000-00-00 00:00:00'));  // returns: bool(false)
Run Code Online (Sandbox Code Playgroud)

似乎PHP在处理这种情况时总是遇到问题.例如:Bug#30190,Bug#60288

引用PHP bug跟踪器中的注释:

0000-00-00是一个不存在的日期(01-01-0001之前的那一天是31/12/-0001)