Есть ли простой способ преобразовать один формат даты в другой в PHP?
$old_date = date('y-m-d-h-i-s'); // работает
$middle = strtotime($old_date); // возвращает false
$new_date = date('Y-m-d H:i:s', $middle); // возвращает 1970-01-01 00:00:00
Хотелось бы, чтобы код возвращал текущую дату. Что я делаю неправильно?
Ответ 1
Второй параметр date() должен быть точной меткой времени (секунды с 1 января 1970 г.). Вы же передаете строку, которую date() не может распознать.
Можно использовать strtotime() для преобразования строки даты в метку времени. Однако даже strtotime() не распознает y-m-d-h-i-s формат.
PHP 5.3 и выше
Используйте DateTime::createFromFormat. Он позволяет указать точную маску - используя date() синтаксис - для синтаксического анализа дат входящей строки.
PHP 5.2 и ниже
Вам нужно будет вручную проанализировать элементы (год, месяц, день, час, минута, секунда) в функции substr() и передать результаты в mktime(), которая построит вам временную метку. Но это сложный способ! Я рекомендую использовать другой формат, понятный strftime(). strftime() понимает любой ввод даты, например, это работает:
// возвращает текущую дату и время
$old_date = date('l, F d y h:i:s');
$old_date_timestamp = strtotime($old_date);
$new_date = date('Y-m-d H:i:s', $old_date_timestamp);
Ответ 2
Самый простой способ сделать это:
$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('m/d/Y');
Сначала вы указываете формат, в котором находится $dateString. Затем вы указываете ему формат, в котором должна быть $newDateString.
Это позволяет избежать использования strtotime, с которой иногда может быть сложно работать.
Если вы не переходите из одного формата даты в другой, а просто хотите, чтобы текущая дата (или datetime) была в определенном формате, это еще проще:
$now = new DateTime();
$timestring = $now->format('Y-m-d h:i:s');
Ответ 3
Основы
Самый простой способ преобразовать один формат даты в другой - использовать strtotime() с date(). strtotime() преобразует дату в метку времени Unix. Затем эту временную метку Unix можно передать в функцию date(), чтобы преобразовать ее в новый формат.
$timestamp = strtotime('2021-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('2021-07-01T22:35:17.02'));
Имейте в виду, что strtotime() дата должна быть в допустимом формате. Если невозможно представить формат в необходимой форме, то strtotime() вернет false, и ваша дата будет 1969-12-31.
С использованием DateTime()
Начиная с PHP 5.2, появился класс DateTime(), который предлагает нам более мощные инструменты для работы с датами (и временем). Мы можем переписать приведенный выше код с DateTime() следующим образом:
$date = new DateTime('2021-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');
Работа с отметками времени Unix
date() принимает временную метку 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);
Разделите substr на 1000
Поскольку метка времени слишком велика для 32-битных систем, чтобы выполнить математические вычисления, нужно будет использовать библиотеку BCMath для выполнения математических расчетов в виде строк:
$timestamp = bcdiv('1234567899000', '1000');
Чтобы получить временную метку Unix, можно использовать strtotime():
$timestamp = strtotime('1973-04-18');
С DateTime () используется DateTime::getTimestamp()
$date = new DateTime('2021-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();
Если вы используете PHP 5.2, можно использовать параметр форматирования «U»:
$date = new DateTime('2021-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('2021-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');
Web