我想知道为什么这个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
的输出也不正确。
任何人都可以帮忙。 感谢。
答案 0 :(得分:1)
DateTime闰年代码适用于公历日历规则,但它们不适用于波斯日历。
除以400之外的“除以4但不是100”规则对波斯日历无效,后者遵循不同的算法:
https://www.timeanddate.com/date/iran-leap-year.html
基本上,您不能将DateTime
用于波斯日期。另见here。您可能会调整some other code。
更新:实际上,闰年会出现不同的日历和来源不同意。贾拉利有1397年作为闰年,但波斯日历没有?
答案 1 :(得分:0)
PHP将日期对象内部存储为struct 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)
);
答案 2 :(得分:0)
感谢大家的回复。
当我要将Jalali
日期转换为Gregorian
日期时,我正在尝试创建DateTime
日期字符串{{1}的PHP Jalali
对象然后使用this package将日期对象转换为("1397/02/29")
日期对象。我通过直接将Gregorian
日期字符串转换为我想要的morilog/jalali来修复此问题,如下所示:
Jalali
再次感谢大家。