Неверный разговор о дате (от ndY до Y-m-d H: i: s)

Мой код возвращает неверную дату разговора

<?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

Вопросы:

  1. Почему PHP не может конвертировать ndY в Y-m-d H:i:s
  2. Почему PHP добавляет текущие часы, а не 00:00:00

Примечание: я пробовал с date(), date_create, date_format и я получил те же результаты (неправильная дата)

3

Решение

Так близко! 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 формат.

2

Другие решения

Ответ ваши входные данные должны быть нормализованы. Я не знаю, какие критерии вы используете, но я предполагаю, что последние четыре символа всегда будут годом.

Теперь я не знаю, должен ли день месяца состоять из двух символов, или вы могли бы получить дату, например «112015»? Если так, что вы должны сделать с ‘1112015’? 11 января или 1 ноября?

Нормализация данных очень важна.

Предполагая, что день месяца всегда состоит из двух цифр, самое простое решение будет:

if ( strlen($date)<8 ) {
$date = '0'.$date;
}

Если и дата, и месяц могут быть одной цифрой, значит, у вас проблемы!

1

По вопросам рекламы [email protected]