PHP DateTime 给出了错误的值

PHP DateTime gives incorrect value

我想知道为什么这个 php 代码给出了错误的输出值。

dd(new \DateTime("1397/02/29", new \DateTimeZone('Asia/Tehran')));

它输出以下对象:

DateTime @-18076965944 {#1256 ▼
  date: 1397-03-01 00:00:00.0 Asia/Tehran (+03:25)
}

如您所见,日期不正确,必须是 1397-02-01。 值 1397/02/30 && 1397/02/31 的输出也不正确。

谁能帮忙。 谢谢。

DateTime 闰年代码适用公历规则,不适用于波斯历。

"divide by 4 but not 100 except 400" 规则对波斯历无效,它遵循不同的算法:

https://www.timeanddate.com/date/iran-leap-year.html

基本上,您不能对波斯语日期使用 DateTime。另见 here. You might perhaps adapt some other code

更新:其实不同历法和来源不同意闰年。贾拉里有闰年 1397 但波斯历没有?

PHP 将内部日期对象存储为结构 https://github.com/php/php-src/blob/master/ext/date/php_date.h#L137 https://github.com/php/php-src/blob/master/ext/date/lib/timelib.h#L204

但 DateTime init 没有验证,只将给定的日期字符串转换为时间戳。 https://github.com/php/php-src/blob/master/ext/date/php_date.c#L2647

在创建日期对象之前,您应该使用 http://php.net/manual/en/function.checkdate.php

检查它
var_dump(
    checkdate(2,20,1000), // bool(true)
    checkdate(2,30,1000) // bool(false)
);

谢谢大家的回复。

当我打算将 Jalali 日期转换为 Gregorian 日期时,我试图为我的 [=11= 创建一个 PHP DateTime 对象] 日期字符串 ("1397/02/29") 然后使用 this package. I fixed the issue by directly converting my Jalali date string to what i want using morilog/jalali 将日期对象转换为 Gregorian 日期对象,如下所示:

$jalali_date = explode("/", request()->to);

$gregorian_date_time = \jDateTime::toGregorianDate($jalali_date[0], $jalali_date[1], $jalali_date[2])->setTime(23, 55)->format("Y-m-d H:i");
return $gregorian_date_time;

再次感谢大家。