PHP DateTime给出的值不正确

PHP DateTime给出的值不正确,php,datetime,persian,persian-calendar,jalali-calendar,Php,Datetime,Persian,Persian Calendar,Jalali Calendar,我想知道为什么这个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的输出也不正确 谁能帮忙吗

我想知道为什么这个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
的输出也不正确

谁能帮忙吗。
谢谢。

日期时间闰年代码适用公历规则,不适用于波斯历

“除以4,但除400外不除以100”规则对波斯日历无效,波斯日历采用不同的算法:

https://www.timeanddate.com/date/iran-leap-year.html
基本上,波斯日期不能使用
DateTime
。另见。你可能会适应


更新:事实上,不同的日历和来源似乎不同意闰年。Jalali将1397作为闰年,但波斯日历没有?

PHP将日期对象内部存储为结构

但DateTime init没有验证功能,只将给定的日期字符串转换为时间戳。

在创建日期对象之前,应该使用


谢谢大家的回复

当我要将
Jalali
日期转换为
Gregorian
日期时,我试图为我的
Jalali
日期字符串
(“1397/02/29”)
创建一个PHP
DateTime
对象,然后使用将date对象转换为
Gregorian
日期对象。我通过直接将我的
Jalali
date字符串转换为我想要的字符串,解决了这个问题,如下所示:

$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;

再次感谢大家

我怀疑今年有2月29日。@u_mulder这是一个波斯日期并退出。我想
DateTime
类不支持您的日历。它不能解决问题,
checkdate()
函数验证
Gregorian
日期,但我使用的日期是
Jalali
$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;