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;
再次感谢大家。
我想知道为什么这个 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;
再次感谢大家。