Преобразовать дату формата в другой в PHP
есть ли простой способ конвертировать один формат даты в другой формат даты в 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
но я бы, конечно, хотел, чтобы он вернул текущую дату, а не Рассвет. Что я делаю не так?
14 ответов:
второй параметр
date()должен быть соответствующего типа timestamp (секунды с 1 января 1970 года). Вы передаете строку, которую date () не может распознать.можно использовать strtotime () для преобразования строки даты в метку времени. Однако даже strtotime () не распознает .
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);
самый простой способ сделать это -
$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');этот и другие вопрос также относится к той же теме:преобразовать формат даты гггг-ММ-ДД => ДД-ММ-гггг.
Основы
упрощенный способ преобразования одного формата даты в другой-использовать
strtotime()Сdate().strtotime()преобразует дату в Unix Timestamp. Эта временная метка 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 timeatamp в качестве второго параметра и возвращает форматированную дату для вас:$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
вы также можете конвертировать метку времени в секундах, разделив на 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');
попробуйте это:
$old_date = date('y-m-d-h-i-s'); $new_date = date('Y-m-d H:i:s', strtotime($old_date));
преобразование
$dateСdd-mm-yyyy hh:mm:ssдля правильного MySQL datetime Я иду вот так:$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
$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);или
$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);
ниже приведен простой способ преобразования дат в различные форматы.
// 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";
вам нужно преобразовать $old_date обратно в метку времени, как дата требуется метка времени в качестве второго аргумента.
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"; ?>
попробуйте это:
$tempDate = explode('-','03-23-15'); $date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];
этот собственный способ поможет конвертировать любой введенный формат в нужный формат.
$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);
это решило для меня,
$old = '18-04-2018'; $new = date('Y-m-d', strtotime($old)); echo $new;выход : 2018-04-18
Это другой способ конвертировать формат даты
<?php $pastDate = "Tuesday 11th October, 2016"; $pastDate = str_replace(",","",$pastDate); $date = new DateTime($pastDate); $new_date_format = $date->format('Y-m-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')
Comments