PHP DateTime提供的值不正确

时间:2018-05-20 09:59:55

标签: 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的输出也不正确。

任何人都可以帮忙。 感谢。

3 个答案:

答案 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

再次感谢大家。