Есть ли простой способ конвертировать один формат даты в другой формат даты в PHP?
У меня есть это:
$old_date = date('y-m-d-h-i-s'); // works
$middle = strtotime($old_date); // returns bool(false)
$new_date = date('Y-m-d H:i:s', $middle); // returns 1970-01-01 00:00:00
Но я бы, конечно, хотел бы вернуть текущую дату, а не рассвет. Что я делаю неправильно?
Второй параметр для date()
должна быть правильная метка времени (секунды с 1 января 1970 года). Вы передаете строку, которую date () не может распознать.
Ты можешь использовать StrToTime () преобразовать строку даты в метку времени. Однако даже strtotime () не распознает y-m-d-h-i-s
формат.
PHP 5.3 и выше
использование DateTime::createFromFormat
. Это позволяет вам указать точную маску — используя date()
синтаксис — для разбора входных строковых дат.
PHP 5.2 и ниже
Вам нужно будет разобрать элементы (год, месяц, день, час, минута, секунда) вручную, используя substr()
и передать результаты указываете ей () это создаст вам метку времени.
Но это много работы! Я рекомендую использовать другой формат, понятный strftime (). strftime () понимает любой ввод даты за исключением the next time joe will slip on the ice
, например, это работает:
$old_date = date('l, F d y h:i:s'); // returns Saturday, January 30 10 02:06:34
$old_date_timestamp = strtotime($old_date);
$new_date = date('Y-m-d H:i:s', $old_date_timestamp);
Самый простой способ сделать это
$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('m/d/Y');
Сначала вы даете ему формат, в котором находится $ dateString. Затем вы указываете формат, в котором вы хотите, чтобы $ newDateString находился.
Это также позволяет избежать использования strtotime, с которым иногда бывает трудно работать.
Если вы не переходите из одного формата даты в другой, а просто хотите текущую дату (или дату / время) в определенном формате, тогда это еще проще:
$now = new DateTime();
$timestring = $now->format('Y-m-d h:i:s');
Этот другой вопрос также относится к той же теме: Преобразовать формат даты гггг-мм-дд => дд-мм-гггг.
Основы
Самый простой способ конвертировать один формат даты в другой — это использовать strtotime()
с date()
. strtotime()
преобразует дату в Unix Timestamp. Эта метка времени Unix может быть передана date()
преобразовать его в новый формат.
$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);
Или как однострочник:
$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));
Имейте в виду, что strtotime()
требует, чтобы дата была в действительный формат. Неспособность предоставить правильный формат приведет к strtotime()
возвращая false, что приведет к тому, что ваша дата будет 1969-12-31.
С помощью DateTime()
Начиная с PHP 5.2, PHP предлагал DateTime()
класс, который предлагает нам более мощные инструменты для работы с датами (и временем). Мы можем переписать приведенный выше код, используя DateTime()
как так:
$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');
Работа с метками времени Unix
date()
принимает timeatamp Unix в качестве второго параметра и возвращает отформатированную дату для вас:
$new_date_format = date('Y-m-d H:i:s', '1234567890');
DateTime () работает с метками времени Unix, добавляя @
до отметки времени:
$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');
Если у вас есть метка времени в миллисекундах (она может заканчиваться на 000
и / или метка времени длиной тринадцать символов) вам потребуется преобразовать ее в секунды, прежде чем вы сможете преобразовать ее в другой формат. Есть два способа сделать это:
substr()
Обрезка последних трех цифр может быть достигнута несколькими способами, но с использованием substr()
самый простой:
$timestamp = substr('1234567899000', -3);
Вы также можете преобразовать отметку времени в секунды, разделив ее на 1000. Поскольку отметка времени слишком велика для 32-разрядных систем, чтобы выполнять математические операции, вам потребуется использовать BCMath библиотека для математики в виде строк:
$timestamp = bcdiv('1234567899000', '1000');
Чтобы получить Unix Timestamp вы можете использовать strtotime()
который возвращает метку времени Unix:
$timestamp = strtotime('1973-04-18');
С DateTime () вы можете использовать DateTime::getTimestamp()
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();
Если вы используете PHP 5.2, вы можете использовать U
опция форматирования вместо:
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');
Работа с нестандартными и неоднозначными форматами даты
К сожалению, не все даты, с которыми разработчик должен работать, имеют стандартный формат. К счастью, PHP 5.3 предоставил нам решение для этого. DateTime::createFromFormat()
позволяет нам сообщить PHP, в каком формате находится строка даты, чтобы ее можно было успешно проанализировать в объект DateTime для дальнейших манипуляций.
$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');
В PHP 5.4 мы получили возможность делать доступ к элементам класса при добавлении экземпляров, что позволяет нам DateTime()
код в одну строку:
$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');
$new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s');
Попробуй это:
$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));
Преобразовать $date
от dd-mm-yyyy hh:mm:ss
к правильной дате и времени MySQL
Я иду так:
$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
$old_date = date('y-m-d-h-i-s'); // works
Вы делаете неправильно здесь, это должно быть
$old_date = date('y-m-d h:i:s'); // works
разделитель времени ‘:’
Я думаю, что это поможет …
$old_date = date('y-m-d-h-i-s'); // works
preg_match_all('/(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)/', $old_date, $out, PREG_SET_ORDER);
$out = $out[0];
$time = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]);
$new_date = date('Y-m-d H:i:s', $time);
ИЛИ ЖЕ
$old_date = date('y-m-d-h-i-s'); // works
$out = explode('-', $old_date);
$time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]);
$new_date = date('Y-m-d H:i:s', $time);
Ниже приведен простой способ преобразования дат в разные форматы.
// Create a new DateTime object
$date = DateTime::createFromFormat('Y-m-d', '2016-03-25');
// Output the date in different formats
echo $date->format('Y-m-d')."\n";
echo $date->format('d-m-Y')."\n";
echo $date->format('m-d-Y')."\n";
Вам нужно преобразовать $ old_date обратно во временную метку, так как функция даты требует метки времени в качестве второго аргумента.