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