PHP DateTime дает неверное значение - PullRequest
0 голосов
/ 20 мая 2018

Интересно, почему этот 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 голосов
/ 20 мая 2018

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 не имеет проверки и преобразует только данную строку даты в метку времени.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)
);
0 голосов
/ 20 мая 2018

Спасибо всем за ваши ответы.

Поскольку я собирался преобразовать дату Jalali в дату Gregorian, я пытался сделать объект PHP DateTime из моего Jalaliстрока даты ("1397/02/29"), а затем преобразовать объект даты в объект даты Gregorian, используя этот пакет .Я исправил проблему, напрямую преобразовав мою Jalali строку даты в то, что я хочу, используя morilog / 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;

Еще раз спасибо всем.

0 голосов
/ 20 мая 2018

Код високосного года DateTime применяет правила григорианского календаря, и они не работают для персидского календаря.

Правило «делить на 4, но не на 100, кроме 400» недопустимо для персидского календаря, которыйследует другому алгоритму:

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

В принципе, вы не можете использовать DateTime для персидских дат.Смотрите также здесь .Возможно, вы можете адаптировать некоторый другой код .

Обновление : на самом деле, это разные календари и источники не согласны в високосные годы.В Джалали високосный год - 1397, а в персидском календаре нет?

...