Преобразовать дату формата в другой в 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


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

855   14  

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

    Ничего не найдено.