0

我想知道为什么这个 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

3 回答 3

1

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

“除以 4 但不是 100,除了 400”规则对波斯历无效,它遵循不同的算法:

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

基本上,您不能DateTime用于波斯日期。另请参见此处。您可能会修改一些其他代码

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

于 2018-05-20T10:13:12.990 回答
0

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)
);
于 2018-05-20T10:42:39.030 回答
0

谢谢大家的回复。

当我要将Jalali日期转换为Gregorian日期时,我试图制作我的日期字符串的 PHPDateTime对象,然后使用此包将日期对象转换为日期对象。我通过使用morilog/jalali直接将我的日期字符串转换为我想要的内容来解决这个问题,如下所示:Jalali("1397/02/29")GregorianJalali

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

再次感谢大家。

于 2018-05-20T12:16:03.077 回答