Преобразовать формат даты гггг-мм-дд => дд-мм-гггг - PullRequest
443 голосов
/ 21 марта 2010

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

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

Ответы [ 14 ]

975 голосов
/ 21 марта 2010

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

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

(См. Документацию strtotime и date на сайте PHP.)

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

252 голосов
/ 11 июля 2012

Если вы хотите избежать преобразования 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 находился.

Или, если исходный формат всегда "Y-m-d" (гггг-мм-дд), просто используйте 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
?>
69 голосов
/ 21 марта 2010

Использование:

implode('-', array_reverse(explode('-', $date)));

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

33 голосов
/ 19 декабря 2011
$newDate = preg_replace("/(\d+)\D+(\d+)\D+(\d+)/","$3-$2-$1",$originalDate);

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

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

26 голосов
/ 21 марта 2010

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

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

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

26 голосов
/ 21 марта 2010
$timestamp = strtotime(your date variable); 
$new_date = date('d-m-Y', $timestamp);

Подробнее см. Документацию для strtotime.

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

$new_date = date('d-m-Y', strtotime(your date variable));
17 голосов
/ 07 августа 2012

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

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

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

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

Руководство PHP strtotime здесь гласит: «Функция ожидает получить строку, содержащую формат даты на английском языке». На самом деле это означает, что он ожидает американский формат даты в США, например, "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's 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
14 голосов
/ 20 мая 2014

Есть два способа реализовать это:

1

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

2

    $cls_date = new DateTime($date);
    echo $cls_date->format('d-m-Y');
9 голосов
/ 21 марта 2010

Вы можете попробовать функцию strftime(). Простой пример: strftime($time, '%d %m %Y');

8 голосов
/ 30 сентября 2015

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

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...