Конвертировать один формат даты в другой в PHP - PullRequest
310 голосов
/ 30 января 2010

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

Но я, конечно, хотел бы, чтобы он возвращал текущую дату, а не рассвет. Что я делаю не так?

Ответы [ 15 ]

273 голосов
/ 30 января 2010

Второй параметр 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 () понимает, что любая дата ввода меньше 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);   
96 голосов
/ 11 июля 2012

Самый простой способ сделать это -

$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');

Этот другой вопрос также относится к той же теме: Преобразование формата даты гггг-мм-дд => дд-мм-гггг .

46 голосов
/ 15 апреля 2014

Основы

Самый простой способ конвертировать один формат даты в другой - использовать strtotime() с date(). strtotime() преобразует дату в метку времени Unix . Эта временная метка 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() принимает значение времени 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

Вы также можете преобразовать отметку времени в секунды, разделив ее на 1000. Поскольку отметка времени слишком велика для математических вычислений 32-битных систем, вам потребуется библиотека BCMath для выполнения математических операций в виде строк :

$timestamp = bcdiv('1234567899000', '1000');

Чтобы получить метку времени Unix, вы можете использовать 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');
26 голосов
/ 30 января 2010

Попробуйте это:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));
14 голосов
/ 04 марта 2013

Чтобы преобразовать $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');
9 голосов
/ 25 марта 2016

Ниже приведен простой способ преобразования дат в различные форматы.

// 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";
9 голосов
/ 30 января 2010
$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); 

OR


$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); 
6 голосов
/ 24 июля 2013

strtotime сработает. даты просто не совпадают и все в американском формате.

<?php
$e1 = strtotime("2013-07-22T12:00:03Z");
echo date('y.m.d H:i', $e1);
echo "2013-07-22T12:00:03Z";

$e2 = strtotime("2013-07-23T18:18:15Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-23T18:18:15Z";

$e1 = strtotime("2013-07-21T23:57:04Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-21T23:57:04Z";
?>
6 голосов
/ 30 января 2010

Вам необходимо преобразовать $ old_date обратно в метку времени, так как функция даты требует метку времени в качестве второго аргумента.

5 голосов
/ 07 февраля 2018

Этот собственный способ поможет преобразовать любой введенный формат в желаемый формат.

$formatInput = 'd-m-Y'; //Give any format here, this would be converted into your format
$dateInput = '01-02-2018'; //date in above format

$formatOut = 'Y-m-d'; // Your format
$dateOut = DateTime::createFromFormat($formatInput, $dateInput)->format($formatOut);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...