Конвертировать формат даты в PHP


489

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

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


22
дд-мм-гггг - это стандартный формат в (большей части) Европы, по крайней мере, когда вам необходимо представить данные пользователям.
Маттео Рива

7
дд-мм-гггг в Австралии и Новой Зеландии тоже
Джонатан Дэй

2
мм-дд-гггг в США. @stesch: первое стандартно в SQL. Я не уверен, что это стандартно в любой стране. :)
Герберт

11
На самом деле стандартом является гггг-мм-дд в соответствии с ISO 8601 .
Джезен Томас

7
Глобальный «Стандарт» - это гггг-мм-дд, и его всегда следует использовать в системах, где это возможно. День заказа, месяц, год используются людьми в большинстве стран мира (кроме США), но обычно с косой чертой, а не с дефисами. Чтобы избежать путаницы, я разделяю YYYY-MM-DD только дефисами. Любой другой формат даты я отделю косыми чертами. Это держит вещи последовательными.
rjmunro

Ответы:


1057

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

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

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

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


14
Что если я получу эту дату 0000-00-00 из mySQL? он возвращает неправильную дату, такую ​​как 31.12.1969 ...
Энрике

3
@Enrique: Если вы получаете 000-00-00 от MySQL, вы должны проверить это ПЕРВЫЙ, прежде чем пройти через преобразование. Simples.
ShadowStorm

1
@SobinAugustine и другие: strtotime () преобразует строку даты в «метку времени Unix (количество секунд с 1 января 1970 00:00:00 UTC)», которую формат даты () может понять, а затем преобразовать из. Так что это не будет работать с отметкой времени до 1970 года.
Сэмюэль Линдблом

1
@SamuelLindblom нет, это не так, это будет работать до 1970 года.
Собин Августин

1
@SobinAugustine: Вы правы. Однако он не будет работать до 1901-12-14, так что это все еще относится к тому, почему даты, перечисленные выше, не работают.
Сэмюэл Линдблом

272

Если вы хотите избежать преобразования 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» (гггг-мм-дд), просто используйте 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
?>

17
Спасибо за DateTime::createFromFormat()- это действительно более полезно, чемstrtotime()
Gtx

2
Примечание: PHP 5.3+ требуется для первых двух методов.
Салман фон Аббас

Спасибо за новую опцию DateTime. Это сработало и было очень чистым вариантом.
Нина Морена

1
strtotime()полезно для преобразования формата истинного типа (Ymd) в другие форматы, но DateTime::createFromFormat()универсально. Это как STR_TO_DATEв MySQL
Тарон Сарибекян

Этот просто действительно работает для меня, а не ерундаstrtotime()
Code

72

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

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

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


Да, ответил, как вы представили свои, я верю. Конечно, проверка ошибок, найденная в strtotime, может быть чем-то полезным.
Тим Литл

2
Мне было полезно конвертировать неамериканский формат даты ... дд-мм-гггг => гггг-мм-дд См. Php.net/manual/en/datetime.formats.date.php
Крис Джейкоб

5
Не понимаю, почему этот ответ имеет меньше голосов. Это должен быть самый лучший ответ. Это решает проблему просто и быстро без каких-либо проблем. Спасибо
Наим Уль Ваххаб

2
Вы даже можете позвонить еще раз, если вам нужно вернуть формат даты в исходную форму. Лучший ответ на самом деле. :)
Педро Араужо Хорхе

1
это должно быть изменено как принятый ответ, это решает все проблемы даты и времени с использованием формата даты и даты.
Маттео Бонони 'peorthyr'

38
$newDate = preg_replace("/(\d+)\D+(\d+)\D+(\d+)/","$3-$2-$1",$originalDate);

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

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


Спасибо вам большое!
Ле Ван Чин

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

Для получения дополнительной информации см. Документацию дляstrtotime .

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

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

27

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

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

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


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

18

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

Хотя в документации плохо описана функция strtotime, @rjmunro правильно исправил проблему в своем комментарии: она указана в формате ISO «YYYY-MM-DD».

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

Самый голосующий ответ на самом деле неверен!

В руководстве PHP strtotime здесь говорится, что «Функция ожидает получить строку, содержащую формат даты на английском языке». На самом деле это означает, что ожидается американский формат даты в США, такой как «mdY» или «m / d / Y».

Это означает, что дата, указанная как «Ymd», может быть неверно истолкована 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

2
Продолжая читать, мне нравится, что Ceiroa исправит это. Это намного проще, чем взорвать / взорвать дату.
Игорь Донин

3
Верхний ответ не является неправильным. PHP правильно делает с датой в формате ISO "YYYY-MM-DD". Он не может неверно истолковать его как дату в США, потому что он имеет 4 цифры в начале и использует - не / как разделитель. Даты ISO были тщательно разработаны, чтобы не путать их с другими форматами.
rjmunro

14

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

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

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

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);
}

7

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

$tomorrow = mktime(0, 0, 0, date("m"), date("d") + 1, date("Y"));
echo date("d", $tomorrow) . "/" . date("m", $tomorrow). "/" . date("Y", $tomorrow);


2

Вы можете изменить формат, используя дату () и strtotime ().

$ date = '18.09.2009';

дата эха ('dm-y', strtotime ($ date));

Результат:

18-09-19

Мы можем изменить формат, изменив (dmy).


1

Для этого конкретного преобразования мы также можем использовать строку формата.

$new = vsprintf('%3$s-%2$s-%1$s', explode('-', $old));

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


как конвертировать 2019-10-28T17: 02: 49Z в метку времени?
Богдан Богданов

1
Использование strtotime(). :-)
не паникуйте

1
    function dateFormat($date) {
        $m = preg_replace('/[^0-9]/', '', $date);
        if (preg_match_all('/\d{2}+/', $m, $r)) {
        $r = reset($r);
            if ($r[2] <= 12 && $r[3] <= 31) return "$r[0]$r[1]-$r[2]-$r[3]";// Y-m-d
            if ($r[0] <= 31 && $r[1] != 0 && $r[1] <= 12) return "$r[2]$r[3]-$r[1]-$r[0]";// d-m-Y
            if ($r[0] <= 12 && $r[1] <= 31) return "$r[2]$r[3]-$r[0]-$r[1]";// m-d-Y
            if ($r[2] <= 31 && $r[3] <= 12) return "$r[0]$r[1]-$r[3]-$r[2]";//Y-m-d
        }
    }

var_dump(dateFormat('31/01/2000')); // return 2000-01-31
var_dump(dateFormat('01-31-2000')); // return 2000-01-31
var_dump(dateFormat('2000-31-01')); // return 2000-01-31
var_dump(dateFormat('20003101')); // return 2000-01-31

0

Простой способ использования strtotime()и date():

$original_dateTime = "2019-05-11 17:02:07"; #This may be database datetime
$newDate = date("d-m-Y", strtotime($original_dateTime));

Со временем

$newDate = date("d-m-Y h:i:s a", strtotime($original_dateTime));

0

Используйте date_createиdate_format

Попробуй это.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.