Перетворити формат дати в PHP


489

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

Як це можливо?


21
dd-mm-yyyy - це стандартний формат у (більшості) Європи, щонайменше, коли вам потрібно представити дані користувачам.
Маттео Ріва

7
dd-mm-yyyy в Австралії та Новій Зеландії
День Джонатана

2
мм-дд-рр-р США. @stesch: колишній є стандартним у SQL. Я не впевнений, що це стандарт у будь-якій країні. :)
Герберт

10
Насправді стандарт є yyyy-mm-dd відповідно до ISO 8601 .
Єзен Томас,

7
Глобальний "Стандарт" є yyyy-mm-dd, і його завжди слід використовувати в системах, де це можливо. День, місяць, рік замовлення користуються людьми в більшості країн світу (крім США), але зазвичай з косою рискою, а не дефісами. Щоб уникнути плутанини, я відокремлюю лише YYYY-MM-DD з дефісами. Будь-який інший формат дати я відокремлюю косою рисою. Це підтримує послідовність речей.
rjmunro

Відповіді:


1055

Використання strtotime()та date():

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

(Дивіться документацію щодо строку часу та дати на сайті PHP.)

Зауважте, що це було швидким вирішенням оригінального питання. Для більш широких перетворень вам слід використовувати DateTimeклас для розбору та форматування :-)


14
Що робити, якщо я отримаю цю дату 0000-00-00 від mySQL? він повертає неправильну дату, наприклад, 31.12.1969 ...
Енріке

3
@Enrique: Якщо ви отримуєте 000-00-00 від MySQL, вам слід перевірити ПЕРШИЙ, перш ніж ставити його через конверсію. Симплекс.
ShadowStorm

1
@SobinAugustine та ін: strtotime () перетворить рядок дати в "часову позначку Unix (кількість секунд з 1 січня 1970 00:00:00 UTC)", дата формату () може зрозуміти, а потім перетворити з. Отже, це не спрацює із позначкою часу до 1970 року.
Самуель Ліндблом,

1
@SamuelLindblom ні, це не так, це працюватиме до 1970 року.
Собін Августин

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

271

Якщо ви хочете уникнути перетворення 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
?>

17
Дякую за те, що DateTime::createFromFormat()- це справді корисніше ніжstrtotime()
Gtx

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

Дякуємо за новий параметр DateTime. Це спрацювало і було дуже чистим варіантом.
Ніна Морена

1
strtotime()корисний для перетворення формату справжнього типу (Ymd) в інші формати, але DateTime::createFromFormat()є універсальним. Це як STR_TO_DATEу MySQL
Тарон Сарибекян

Цей просто справді працював для мене замість фігняstrtotime()
Code Cooker

72

Використання:

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

Без накладних переходів дати, я не впевнений, що це матиме багато значення.


Так, я відповів, коли ви подали своє, я вважаю. Звичайно, перевірка помилок, виявлена ​​в strtotime, може бути корисною.
Тім Літл

2
Був корисний для мене при перетворенні неамериканського формату дати ... dd-mm-yyyy => yyyy-mm-dd Див. Php.net/manual/en/datetime.formats.date.php
Кріс Джейкоб

5
Не розумійте, чому ця відповідь має менше голосів. Це має бути найкраща відповідь. Він вирішує проблему просто та швидко без будь-яких питань. Спасибі
Naeem Ul Wahhab

2
Ви можете навіть зателефонувати ще раз, якщо вам потрібно повернути формат дати до початкового виду. Найкраща відповідь справді. :)
Педро Арауджо Хорхе

1
це слід змінити як прийняту відповідь, воно вирішує всі питання дати та часу використання форматів дати та дати.
Маттео Бононі 'петортер'

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

Цей код працює для кожного формату дати.

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


Велике спасибі!
Lê Văn Chiến


27

Також ще одна незрозуміла можливість:

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

Я не знаю, чи би я ним користувався, але все ж :)


1
Я в кінцевому підсумку скористався цим, оскільки в нашому додатку люди вводили б "99", якщо одне з полів (день, місяць, рік) невідоме. Хороший підхід, якщо у ваших даних є якісь "підроблені" дати.
Вуду

18

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

Хоча документація погано описує функцію strtotime, @rjmunro правильно вирішив цю проблему у своєму коментарі: це в даті формату ISO "РРРР-ММ-DD".

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

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

У посібнику з strtotime для PHP тут зазначено, що "Функція очікує, що їй буде надано рядок, що містить англійський формат дати". Це насправді означає, що він очікує американського формату дат, наприклад, "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 "РРРР-ММ-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()та змінити його формат на формат 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);


2

Ви можете змінити формат, використовуючи дату () та строку часу ().

$ date = '18.09.2019';

echo date ('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.