PHP DateTime :: createFromFormat возвращает неправильную дату - PullRequest
0 голосов
/ 31 октября 2019

При попытке запустить createFromFormat с использованием часового пояса Pacific / Auckland и строки формата 'F-Y'. Возвращенная дата - первое октября, хотя я поставил ее с «сентябрь-2019».

Я попытался запустить ее на PHP 7.3.9 и 7.2.22 в CLI и FPM, а также онлайн вПесочница PHP.

<?php
echo DateTime::createFromFormat('F-Y', 'September-2019')                                                           
    ->setTimezone(new DateTimeZone('Pacific/Auckland'))
    ->format('Y-m-d');
// 2019-10-01

echo DateTime::createFromFormat('F-Y', 'September-2019')
    ->format('Y-m-d');
// 2019-09-01

В обоих этих примерах возвращаемая дата должна была быть 2019-09-01. Это не случилось вчера.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Причина такого поведения заключается в том, что, если вы не указываете недостающие части ввода даты / времени в DateTime::createFromFormat, он использует значения из текущей локальной даты и времени. В Окленде это 31 октября, и поэтому он пытается сделать дату 31 сентября 2019 года, которая выходит 1 октября 2019 года. Чтобы избежать этой проблемы, используйте ! в начале строки формата;вместо этого это заменит значения с 1 января 1970 года, 00:00:00 (эпоха Unix), как требуется для тех, которые не указаны в значении времени:

echo DateTime::createFromFormat('!F-Y', 'September-2019')
    ->setTimeZone(new DateTimeZone('Pacific/Auckland'))
    ->format('Y-m-d');

Вывод:

2019-09-01

Демонстрация на 3v4l.org

0 голосов
/ 31 октября 2019

А как же мой друг:

date_default_timezone_set('Pacific/Auckland');

$date = DateTime::createFromFormat('F-Y', 'September-2019');

$new_date_format = $date->format('Y-m-01');

echo $new_date_format;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...