Есть база данных в которой порядка 600 записей у записей есть дата публикации которую кто только не вводил как попало. В результате в одной колонке имею такие типы дат:
12-08-14
31/08/15
15.01.13
Как бы мне все их массово привести к формату timestamp? ну или хотябы к какому-то одному?
Мои фантазии:
Я примерно представляю это так: делаю выбор всех записей из бд - далее нужно составить некое хитрое условие if (формат типа 12-08-14) далее foreach где все записи прошедшие через условие формата 1 преобразуются в timestamp и обновляется строка в БД. Соответственно запускаю файл на исполнение. Ну и так повторяем с каждым типом формата.
Вопрос:
Собственно как сделать условие для типа определённого формата даты? И как сделать преобразование оного в timestamp?
Признаюсь - мои навыки PHP весьма скромные, по этому буду очень признателен за развёрнутые примеры. Благодарю за внимание.
Можно воспользоваться штатным классом 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 месяцем, что класс интерпретирует как август последующего года. Поэтому я форматирую дату обратно в исходный формат и проверяю, совпадает ли она.
Если формат всегда определяется маской 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'
)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Здравствуйте! Пожалуйста, помогите с AJAX в связке с PHP
Меню ведет себя аномальноДочерние подпункты второго уровня видны только при переходе по ссылке на родительский элемент первого уровня
Проблема в том, что функция получив в ответ $js=file_get_contents 2 и более title использует один и по нему выдает результат