Как с PHP привести все даты к одному формату?

370
06 марта 2017, 13:20

Есть база данных в которой порядка 600 записей у записей есть дата публикации которую кто только не вводил как попало. В результате в одной колонке имею такие типы дат:

12-08-14

31/08/15

15.01.13

Как бы мне все их массово привести к формату timestamp? ну или хотябы к какому-то одному?

Мои фантазии:

Я примерно представляю это так: делаю выбор всех записей из бд - далее нужно составить некое хитрое условие if (формат типа 12-08-14) далее foreach где все записи прошедшие через условие формата 1 преобразуются в timestamp и обновляется строка в БД. Соответственно запускаю файл на исполнение. Ну и так повторяем с каждым типом формата.

Вопрос:

Собственно как сделать условие для типа определённого формата даты? И как сделать преобразование оного в timestamp?

Признаюсь - мои навыки PHP весьма скромные, по этому буду очень признателен за развёрнутые примеры. Благодарю за внимание.

Answer 1

Можно воспользоваться штатным классом DateTime. Для приведённых форматов:

function normalizeDate($input) {
    $possibleFormats = [
        'd-m-y',
        'd/m/y',
        'd.m.y',
    ];
    foreach ($possibleFormats as $format) {
        $rDate = \Datetime::createFromFormat($format, $input);
        if (!$rDate) {
            continue; // точно не этот формат
        }
        if ($rDate->format($format) == $input) {
            // перепроверили формат, это именно нужный
            return $rDate->format('Y-m-d');
        }
    }
    throw new \exception('unknown format in date string '.$input);
}
$testInput = [
    '12-08-14',
    '31/08/15',
    '15.01.13',
];
foreach ($testInput as $input) {
    echo $input, "\t=> ",normalizeDate($input),PHP_EOL;
}

Привожу к стандартному для баз данных формату год-месяц-день типа данных date. Всё-таки надо использовать подходящие типы данных.

Отдельно поясню странную вторую проверку: класс datetime считает, что дата может быть указана не обязательно согласно календарю. Например, допустима дата с 20 месяцем, что класс интерпретирует как август последующего года. Поэтому я форматирую дату обратно в исходный формат и проверяю, совпадает ли она.

Answer 2

Если формат всегда определяется маской dd-mm-yy, где - некий разделитель, то можно все сделать одним апдейтом в БД. Для MySQL это будет выглядеть так:

UPDATE mytable SET
  fld_timestamp =
    STR_TO_DATE(
      CONCAT(
        SUBSTRING(fld_str, 1, 2),
        '-',
       SUBSTRING(fld_str, 4, 2),
        '-',
        SUBSTRING(fld_str, 7)
      ),
      '%d-%m-%y'
    )
  • вначале вычленяем день, месяц и год из строки
  • далее формируем строку но уже известного формата и с известным разделителем
  • преобразовываем эту строку в дату
READ ALSO
Как получить ответ от сервера к множественным формы ввода через ajax

Как получить ответ от сервера к множественным формы ввода через ajax

Здравствуйте! Пожалуйста, помогите с AJAX в связке с PHP

235
Почему не загружаться подпункты меню joomla! 3?

Почему не загружаться подпункты меню joomla! 3?

Меню ведет себя аномальноДочерние подпункты второго уровня видны только при переходе по ссылке на родительский элемент первого уровня

295
Исправить функцию вывода

Исправить функцию вывода

Проблема в том, что функция получив в ответ $js=file_get_contents 2 и более title использует один и по нему выдает результат

275