Преобразовать формат даты гггг-мм-дд => дд-мм-гггг

347

Я пытаюсь преобразовать дату из yyyy-mm-dd в dd-mm-yyyy (но не в SQL); однако я не знаю, как функция даты требует отметки времени, и я не могу получить временную метку из этой строки.

Как это возможно?

  • 0
    Зачем тебе это делать? Первый является стандартом в большинстве стран. qsl.net/g1smd/isoimp.htm
  • 21
    дд-мм-гггг - это стандартный формат в (большей части) Европы, по крайней мере, когда вам нужно представить данные пользователям.
Показать ещё 6 комментариев
Теги:
date
formatting

12 ответов

792
Лучший ответ

Используйте strtotime() и date():

$originalDate = "2010-03-21";
$newDate = date("d-m-Y", strtotime($originalDate));

(см. strtotime и date docs на сайте PHP).

Изменить. Обратите внимание, что это было быстрое решение исходного вопроса. Для более обширных преобразований вы должны действительно использовать класс DateTime для синтаксического анализа и форматирования: -)

  • 11
    Что если я получу эту дату 0000-00-00 из mySQL? он возвращает неправильную дату, такую как 31.12.1969 ...
  • 2
    @Enrique: Если вы получаете 000-00-00 от MySQL, вы должны проверить это ПЕРВЫЙ, прежде чем пройти через преобразование. Simples.
Показать ещё 8 комментариев
194

Если вы хотите избежать преобразования strtotime (например, strtotime не может проанализировать ваш ввод), вы можете использовать

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

или, что эквивалентно:

$newDateString = date_format(date_create_from_format('Y-m-d', $dateString), 'd-m-Y');

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

Или, если исходный формат всегда равен "Ymd" (yyyy-mm-dd), просто используйте DateTime:

<?php
$source = '2012-07-31';
$date = new DateTime($source);
echo $date->format('d.m.Y'); // 31.07.2012
echo $date->format('d-m-Y'); // 31-07-2012
?>
  • 14
    Спасибо за DateTime::createFromFormat() - это действительно более полезно, чем strtotime()
  • 2
    Примечание: PHP 5.3+ требуется для первых двух методов.
Показать ещё 4 комментария
57
implode('-', array_reverse(explode('-', $date)));

Без накладных расходов преобразования даты, не уверен, что это будет иметь большое значение.

  • 0
    Да, ответил, как вы представили свои, я верю. Конечно, проверка ошибок, найденная в strtotime, может быть чем-то полезным.
  • 2
    Это было полезно для меня при преобразовании неамериканского формата даты ... dd-mm-yyyy => yyyy-mm-dd См. Php.net/manual/en/datetime.formats.date.php
Показать ещё 8 комментариев
28
$newDate = preg_replace("/(\d+)\D+(\d+)\D+(\d+)/","$3-$2-$1",$originalDate);

Этот код работает для каждого формата даты.

Вы можете изменить порядок замены переменных, таких как $3- $1- $2, из-за вашего старого формата даты.

  • 0
    Спасибо вам большое!
23
$timestamp = strtotime(your date variable); 
$new_date = date('d-m-Y', $timestamp);

Подробнее:

нажмите здесь

Или даже короче:

$new_date = date('d-m-Y', strtotime(your date variable));
21

Еще одна неясная возможность:

$oldDate = '2010-03-20'
$arr = explode('-', $oldDate);
$newDate = $arr[2].'-'.$arr[1].'-'.$arr[0];

Я не знаю, буду ли я использовать его, но все же:)

  • 1
    Я использовал это, потому что в нашем приложении люди вводили бы «99», если одно из полей (день, месяц, год) неизвестно. Хороший подход, если в ваших данных есть фиктивные даты.
14

Изменить: потому что этот пост ответ иногда получает upvoted, я вернулся здесь, чтобы любезно попросить людей больше не повышать его. Мой ответ но не технически правильно, и есть несколько лучше подходит здесь. Я держу его здесь только для исторических целей.

Хотя документация плохо описывает функцию strtotime, @rjmunro правильно рассмотрел вопрос в своем комментарии: он в ISO формат даты "ГГГГ-ММ-ДД".

Кроме того, хотя моя функция Date_Converter может работать, я бы как предупреждать, что могут быть неточные заявления ниже, поэтому, пожалуйста, не обращайте на них внимания.

Самый проголосовавший ответ на самом деле неверен!

PHP strtotime Manual здесь утверждает, что "функция ожидает, что ей будет задана строка, содержащая английский формат даты". На самом деле это означает, что он ожидает формат американской американской даты, такой как "m-d-Y" или "m/d/Y".

Это означает, что дата, представленная как "Y-m-d", может быть неверно истолкована strtotime. Вы должны указать дату в ожидаемом формате.

Я написал небольшую функцию, чтобы возвращать даты в нескольких форматах. Использовать и изменять как будет. Если кто-то превратит это в класс, я был бы рад, если бы это было общим.

function Date_Converter($date, $locale = "br") {

    # Exception
    if (is_null($date))
        $date = date("m/d/Y H:i:s");

    # Let go ahead and get a string date in case we've been given a Unix Time Stamp
    if ($locale == "unix")
        $date = date("m/d/Y H:i:s", $date);

    # Separate Date from Time
    $date = explode(" ", $date);

    if ($locale == "br") {
        # Separate d/m/Y from Date
        $date[0] = explode("/", $date[0]);
        # Rearrange Date into m/d/Y
        $date[0] = $date[0][1] . "/" . $date[0][0] . "/" . $date[0][2];
    }

    # Return date in all formats
        # US
        $Return["datetime"]["us"]   = implode(" ", $date);
        $Return["date"]["us"]       = $date[0];
        # Universal
        $Return["time"]         = $date[1];
        $Return["unix_datetime"]    = strtotime($Return["datetime"]["us"]);
        $Return["unix_date"]        = strtotime($Return["date"]["us"]);
        $Return["getdate"]          = getdate($Return["unix_datetime"]);
        # BR
        $Return["datetime"]["br"]   = date("d/m/Y H:i:s", $Return["unix_datetime"]);
        $Return["date"]["br"]       = date("d/m/Y", $Return["unix_date"]);

    # Return
    return $Return;


} # End Function
  • 2
    Продолжая читать, мне нравится, что Ceiroa исправит это. Это намного проще, чем взорвать / взорвать дату.
  • 3
    Верхний ответ не является неправильным. PHP правильно делает с датой в формате ISO «ГГГГ-ММ-ДД». Он не может неверно истолковать его как дату в США, потому что он имеет 4 цифры в начале и использует - не / в качестве разделителя. Даты ISO были тщательно разработаны, чтобы не путать их с другими форматами.
13

два способа реализации этого

1)

$date = strtotime(date); 
$new_date = date('d-m-Y', $date);

2)

$cls_date = new DateTime($date);
echo $cls_date->format('d-m-Y'); 
8

Вы можете попробовать strftime. Что-то вроде strftime($time, '%d %m %Y');

6

Используйте эту функцию для преобразования из любого формата в любой формат

function reformatDate($date, $from_format = 'd/m/Y', $to_format = 'Y-m-d') {
    $date_aux = date_create_from_format($from_format, $date);
    return date_format($date_aux,$to_format);
}
6

Ниже приведен код PHP для генерации даты завтра, используя mktime(), и измените его формат на dd/mm/yyyy, а затем распечатайте его с помощью echo.

$tomorrow = mktime(0, 0, 0, date("m"), date("d") + 1, date("Y"));
echo date("d", $tomorrow) . "/" . date("m", $tomorrow). "/" . date("Y", $tomorrow);
5
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));
  • 1
    Для Mysql формат даты Ymd, например "2014-04-26"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню