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

Есть ли простой способ преобразования одного формата даты в другой формат даты в PHP?

У меня есть это:

$old_date = date('ymdhi-s'); // works $middle = strtotime($old_date); // returns bool(false) $new_date = date('Ymd H:i:s', $middle); // returns 1970-01-01 00:00:00 

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

Второй параметр на date() должен быть правильной меткой времени (секунды с 1 января 1970 г.). Вы передаете строку, которую date () не может распознать.

Вы можете использовать strtotime () для преобразования строки даты в метку времени. Однако даже strtotime () не распознает формат ymdhis .

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 dyh:i:s'); // returns Saturday, January 30 10 02:06:34 $old_date_timestamp = strtotime($old_date); $new_date = date('Ymd H:i:s', $old_date_timestamp); 

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

 $myDateTime = DateTime::createFromFormat('Ym-d', $dateString); $newDateString = $myDateTime->format('m/d/Y'); 

Сначала вы даете ему формат $ dateString. Затем вы сообщаете ему формат, в котором вы хотите $ newDateString.

Это также позволяет избежать использования strtotime, с которым иногда трудно работать.

Если вы не переходите из одного формата даты в другой, а просто хотите, чтобы текущая дата (или дата-время) была в определенном формате, тогда это еще проще:

 $now = new DateTime(); $timestring = $now->format('Ymd h:i:s'); 

Этот другой вопрос также относится к той же теме: Конвертировать формат даты yyyy-mm-dd => dd-mm-yyyy .

Основы

Простейший способ конвертировать один формат даты в другой – использовать strtotime() с date() . strtotime() преобразует дату в strtotime() Unix . Эта временная метка Unix затем может быть передана date() для преобразования ее в новый формат.

 $timestamp = strtotime('2008-07-01T22:35:17.02'); $new_date_format = date('Ymd H:i:s', $timestamp); 

Или как однострочный:

 $new_date_format = date('Ymd 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('Ymd H:i:s'); 

Работа с отметками времени Unix

date() принимает Unix timeatamp в качестве второго параметра и возвращает вам форматированную дату:

 $new_date_format = date('Ymd H:i:s', '1234567890'); 

DateTime () работает с отметками времени Unix, добавляя @ перед меткой времени:

 $date = new DateTime('@1234567890'); $new_date_format = $date->format('Ymd H:i:s'); 

Если временная метка у вас есть в миллисекундах (она может закончиться на 000 и / или отметка времени составляет тринадцать символов), вам нужно будет преобразовать ее в несколько секунд, прежде чем вы сможете преобразовать ее в другой формат. Есть два способа сделать это:

  • Вырезать последние три цифры с помощью substr()

Обрезка последних трех цифр может быть достигнута несколькими способами, но использование substr() является самым простым:

 $timestamp = substr('1234567899000', -3); 
  • Разделите субстрат на 1000

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

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

Чтобы получить strtotime() времени Unix, вы можете использовать strtotime() которая возвращает 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('FdY h:i A', 'April-18-1973 9:48 AM'); $new_date_format = $date->format('Ymd H:i:s'); 

В PHP 5.4 мы получили возможность сделать доступ к члену класса при создании экземпляра, который позволяет нам превратить наш код DateTime() в однострочный:

 $new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Ymd H:i:s'); $new_date_format = DateTime::createFromFormat('FdY h:i A', 'April-18-1973 9:48 AM')->format('Ymd H:i:s'); 

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

 $old_date = date('ymdhi-s'); $new_date = date('Ymd H:i:s', strtotime($old_date)); 

Чтобы преобразовать $date из dd-mm-yyyy hh:mm:ss в надлежащее MySQL datetime, я делаю следующее:

 $date = DateTime::createFromFormat('dmY H:i:s',$date)->format('Ymd H:i:s'); 
 $old_date = date('ymdhi-s'); // works 

вы делаете неправильно здесь, это должно быть

 $old_date = date('ymd h:i:s'); // works 

разделителем времени является:


Я думаю, это поможет …

 $old_date = date('ymdhi-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('Ymd H:i:s', $time); 

ИЛИ


 $old_date = date('ymdhi-s'); // works $out = explode('-', $old_date); $time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]); $new_date = date('Ymd H:i:s', $time); 

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

 // Create a new DateTime object $date = DateTime::createFromFormat('Ym-d', '2016-03-25'); // Output the date in a different format echo $date->format('Ym-d'); 

strtotime будет работать. даты – это совсем не то же самое и все в нашем формате.

 <?php $e1 = strtotime("2013-07-22T12:00:03Z"); echo date('ymd H:i', $e1); echo "2013-07-22T12:00:03Z"; $e2 = strtotime("2013-07-23T18:18:15Z"); echo date ('ymd H:i', $e2); echo "2013-07-23T18:18:15Z"; $e1 = strtotime("2013-07-21T23:57:04Z"); echo date ('ymd H:i', $e2); echo "2013-07-21T23:57:04Z"; ?> 

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

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

 $tempDate = explode('-','03-23-15'); $date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1]; 

Это другой способ конвертировать формат даты

  <?php $pastDate = "Tuesday 11th October, 2016"; $pastDate = str_replace(",","",$pastDate); $date = new DateTime($pastDate); $new_date_format = $date->format('Ym-d'); echo $new_date_format.' 23:59:59'; ?> 

Просто используя строки, для меня это хорошее решение, меньше проблем с mysql. Обнаруживает текущий формат и при необходимости меняет его, это решение предназначено только для испанского / французского формата и английского формата без использования функции php datetime.

 class dateTranslator { public static function translate($date, $lang) { $divider = ''; if (empty($date)){ return null; } if (strpos($date, '-') !== false) { $divider = '-'; } else if (strpos($date, '/') !== false) { $divider = '/'; } //spanish format DD/MM/YYYY hh:mm if (strcmp($lang, 'es') == 0) { $type = explode($divider, $date)[0]; if (strlen($type) == 4) { $date = self::reverseDate($date,$divider); } if (strcmp($divider, '-') == 0) { $date = str_replace("-", "/", $date); } //english format YYYY-MM-DD hh:mm } else { $type = explode($divider, $date)[0]; if (strlen($type) == 2) { $date = self::reverseDate($date,$divider); } if (strcmp($divider, '/') == 0) { $date = str_replace("/", "-", $date); } } return $date; } public static function reverseDate($date) { $date2 = explode(' ', $date); if (count($date2) == 2) { $date = implode("-", array_reverse(preg_split("/\D/", $date2[0]))) . ' ' . $date2[1]; } else { $date = implode("-", array_reverse(preg_split("/\D/", $date))); } return $date; } 

ИСПОЛЬЗОВАНИЕ

 dateTranslator::translate($date, 'en')