Мой код возвращает неверную дату разговора
<?php
$date = '8312015';
$newDate = DateTime::createFromFormat('ndY', $date);
$convertedDate = $newDate->format('Y-m-d H:i:s');
echo $convertedDate;
Возвращает
0021-11-12 17:04:56
Надеется:
2015-08-31 00:00:00
Вопросы:
ndY
в Y-m-d H:i:s
00:00:00
Примечание: я пробовал с date()
, date_create
, date_format
и я получил те же результаты (неправильная дата)
Так близко! m
на самом деле :
Числовое представление месяца с ведущими нулями от 01 до 12
(http://php.net/manual/en/function.date.php)
Таким образом, это означает, что ожидается, что это будет 2 символа, а не один. Если вы делаете
$date = '08312015';
$newDate = DateTime::createFromFormat('ndY', $date);
Это работает так, как вы хотите
Когда вы делаете
$date = '8312015';
$newDate = DateTime::createFromFormat('ndY', $date);
Вы получаете месяц = 83, день = 12, год = 015
83 месяца — это 6 лет + 11 месяцев
так, 015+6=21
лет +11 месяцев = 11 ноября 21 года, т. е. (0021-11-12
), что соответствует выводу
редактировать: так явно ты имел ввиду n
не m
проблема в том, что у вас нет разделителя между частями даты, поэтому, как уже было сказано, не ясно, должен ли месяц быть 8 или 83 …
Редактировать снова Мой «ответ» только что объяснил проблему, я думаю, не показывая, как это исправить, так что …
Если поля не разделены символом-разделителем (например, -
) или по длине поля (т.е. как m
является всегда 2 символа), то преобразование неоднозначно. Учитывая, что php считает 83 правильным месяцем, а месяц отформатирован как n
может иметь 1 или более цифр, когда php видит 83, он действительно не может знать, имеете ли вы в виду «8-й месяц, а затем что-то, начинающееся с 3» или «83-й месяц».
Итак, что вам нужно сделать, это устранить неоднозначность разграничения. Один из способов устранения неоднозначности — заполнение нулями слева, поскольку d
(и для всех намерений и целей Y
) всегда одинаковое количество цифр (2 и 4 соответственно)
Так, $date=str_pad($date, 8, "0", STR_PAD_LEFT);
превратится
8312015 в 08312015, и тогда вы можете использовать m
отформатировать вместо n
, и вы должны быть в порядке оттуда. Для месяцев> 9 это не изменит входную строку, поэтому будет безопасно для всех строк в этом ndY
формат.
Ответ ваши входные данные должны быть нормализованы. Я не знаю, какие критерии вы используете, но я предполагаю, что последние четыре символа всегда будут годом.
Теперь я не знаю, должен ли день месяца состоять из двух символов, или вы могли бы получить дату, например «112015»? Если так, что вы должны сделать с ‘1112015’? 11 января или 1 ноября?
Нормализация данных очень важна.
Предполагая, что день месяца всегда состоит из двух цифр, самое простое решение будет:
if ( strlen($date)<8 ) {
$date = '0'.$date;
}
Если и дата, и месяц могут быть одной цифрой, значит, у вас проблемы!