Web

Преобразование форматов даты в PHP

Есть ли простой способ преобразовать один формат даты в другой в 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

Как узнать, установлен ли флажок в PHP

Web

Асинхронный запуск задачи PHP

Web

Ошибка при открытии потока в PHP: отсутствует файл или каталог

Как в Git узнать репозиторий: подробная инструкция
Web

Как в Git узнать репозиторий: подробная инструкция

×