Konwertuj format daty w PHP


489

Próbuję przekonwertować datę yyyy-mm-dd na dd-mm-yyyy(ale nie w SQL); nie wiem jednak, w jaki sposób funkcja daty wymaga znacznika czasu i nie mogę uzyskać znacznika czasu z tego ciągu.

Jak to jest możliwe?


21
dd-mm-rrrr jest standardowym formatem w (większości) Europy przynajmniej wtedy, gdy trzeba prezentować dane użytkownikom.
Matteo Riva

7
dd-mm-rrrr również w Australii i Nowej Zelandii
Jonathan Day

2
mm-dd-rrrr w USA. @stesch: ten pierwszy jest standardem w SQL. Nie jestem pewien, czy to standard w żadnym kraju. :)
Herbert

10
W rzeczywistości standardem jest rrrr-mm-dd zgodnie z ISO 8601 .
Jezen Thomas

7
Globalny „Standard” to rrrr-mm-dd i zawsze powinien być używany przez systemy tam, gdzie to możliwe. Porządek dnia, miesiąca i roku jest używany przez ludzi na całym świecie (z wyjątkiem USA), ale zwykle z ukośnikami, a nie łącznikami. Aby uniknąć pomyłek, oddzielam RRRR-MM-DD tylko myślnikami. Każdy inny format daty oddzielę ukośnikami. Dzięki temu wszystko jest spójne.
rjmunro

Odpowiedzi:


1055

Użyj strtotime()i date():

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

(Zobacz dokumentację strtotime i datę na stronie PHP).

Zauważ, że było to szybkie rozwiązanie pierwotnego pytania. W przypadku bardziej rozbudowanych konwersji naprawdę powinieneś używać DateTimeklasy do analizowania i formatowania :-)


14
Co się stanie, jeśli otrzymam tę datę 0000-00-00 z mySQL? zwraca złą datę, np. 31.12.1969 ...
Enrique,

3
@Enrique: Jeśli otrzymujesz 000-00-00 z MySQL, powinieneś przetestować ten PIERWSZY przed wykonaniem konwersji. Simples.
ShadowStorm,

1
@SobinAugustine i wsp .: strtotime () przekonwertuje ciąg daty na „Uniksowy znacznik czasu (liczba sekund od 1 stycznia 1970 00:00:00 UTC)”, format daty () może zrozumieć, a następnie przekonwertować. Nie zadziała to więc ze znacznikiem czasu przed 1970 r.
Samuel Lindblom

1
@SamuelLindblom nie, to nie tak, zadziała przed 1970 rokiem.
Sobin Augustine

1
@SobinAugustine: Masz rację. Nie zadziała to jednak przed 1901-12-14, więc nadal obowiązuje to, dlaczego powyższe daty nie działają.
Samuel Lindblom

271

Jeśli chcesz uniknąć konwersji strtotime (na przykład strtotime nie jest w stanie przeanalizować danych wejściowych), możesz użyć,

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

Lub równoważnie:

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

Najpierw nadajesz mu format $ dateString. Następnie mówisz, że ma on format, w którym ma być $ newDateString.

Lub jeśli formatem źródłowym zawsze jest „Ymd” (rrrr-mm-dd), użyj po prostu 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
Dziękuję za DateTime::createFromFormat()- jest to naprawdę bardziej przydatne niżstrtotime()
Gtx

2
NB: PHP 5.3+ wymagany dla pierwszych dwóch metod.
Salman von Abbas

Dziękujemy za nową opcję DateTime. To działało i było bardzo czystą opcją.
Nina Morena

1
strtotime()przydatny do konwersji True Type format (RMD) do innych formatów, ale DateTime::createFromFormat()jest uniwersalna. To jest jak STR_TO_DATEw MySQL
Taron Saribekyan

Ten naprawdę dla mnie zadziałał Zamiast bzdurystrtotime()
Code Cooker

72

Posługiwać się:

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

Bez narzutu konwersji daty nie jestem pewien, czy będzie to miało duże znaczenie.


Tak, odpowiedziałem, jak przesłałeś swój, wierzę. Oczywiście sprawdzanie błędów znalezione w strtotime może być przydatne.
Tim Lytle


5
Nie rozumiem, dlaczego ta odpowiedź ma mniej głosów. To powinna być najlepiej głosowana odpowiedź. Rozwiązuje problem w prosty i szybki sposób, bez żadnych problemów. Dzięki
Naeem Ul Wahhab,

2
Możesz nawet wywołać go ponownie, jeśli chcesz odwrócić format daty do oryginalnej. Rzeczywiście najlepsza odpowiedź. :)
Pedro Araujo Jorge

1
należy to zmienić jako zaakceptowaną odpowiedź, rozwiąże to cały problem związany z datą i czasem związany z użyciem formatów daty i daty.
Matteo Bononi „peorthyr”

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

Ten kod działa dla każdego formatu daty.

Możesz zmienić kolejność zmiennych zastępczych, np. 3–1–1–2 USD, ze względu na stary format daty.


Dziękuję bardzo!
Lê Văn Chiến

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

Aby uzyskać więcej informacji, zobacz dokumentację dotyczącąstrtotime .

Lub nawet krócej:

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

27

Kolejna niejasna możliwość:

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

Nie wiem, czy bym go użył, ale nadal :)


1
Skończyło się na tym, ponieważ w naszej aplikacji ludzie wpisywali „99”, jeśli jedno z pól (dzień, miesiąc, rok) jest nieznane. Dobre podejście, jeśli masz jakieś „fałszywe” daty w swoich danych.
Voodoo,

18

Uwaga : Ponieważ odpowiedź na ten post jest czasem pozytywnie oceniana, wróciłem tutaj, aby uprzejmie poprosić ludzi, aby nie głosowali więcej. Moja odpowiedź jest starożytna, niepoprawna technicznie, a tutaj jest kilka lepszych podejść. Trzymam to tutaj tylko do celów historycznych.

Chociaż dokumentacja słabo opisuje funkcję strtotime, @rjmunro poprawnie rozwiązał ten problem w swoim komentarzu: jest w formacie ISO „RRRR-MM-DD”.

Ponadto, mimo że moja funkcja Date_Converter może nadal działać, chciałbym ostrzec, że poniżej mogą znajdować się nieprecyzyjne instrukcje, więc proszę je zignorować.

Najczęściej głosowana odpowiedź jest niepoprawna!

Podręcznik PHP strtotime tutaj stwierdza, że „oczekuje funkcji należy podać ciąg zawierający datę w formacie angielskim”. W rzeczywistości oznacza to, że oczekuje amerykańskiego formatu daty w USA, takiego jak „mdY” lub „m / d / Y”.

Oznacza to, że data podana jako „Ymd” może zostać źle zinterpretowana przez strtotime. Powinieneś podać datę w oczekiwanym formacie.

Napisałem małą funkcję zwracania dat w kilku formatach. Używaj i modyfikuj do woli. Jeśli ktokolwiek przekształci to w klasę, byłbym zadowolony, gdyby to zostało udostępnione.

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
Czytając dalej, podoba mi się poprawka Ceiroa. To o wiele łatwiejsze niż wybuchanie / implozowanie daty.
Igor Donin,

3
Najlepsza odpowiedź nie jest niepoprawna. PHP postępuje właściwie z datą formatu ISO „RRRR-MM-DD”. Nie może źle zinterpretować go jako daty amerykańskiej, ponieważ ma 4 cyfry na początku i używa - nie / jako separatora. Daty ISO zostały starannie zaprojektowane, aby nie mylić ich z innymi formatami.
rjmunro

14

Istnieją dwa sposoby realizacji tego:

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

Użyj tej funkcji do konwersji z dowolnego formatu na dowolny format

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

Poniżej podano kod PHP do generowania jutrzejszej daty przy użyciu mktime()i zmiany formatu na dd / mm / rrrr , a następnie wydrukowania za pomocą echo.

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


2

Możesz zmienić format za pomocą date () i strtotime ().

$ date = „18.09.2019”;

echo date ('dm-y', strtotime ($ date));

Wynik:

18-09-19

Możemy zmienić format, zmieniając (dmy).


1

Do tej konkretnej konwersji możemy również użyć ciągu formatu.

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

Oczywiście nie będzie to działać w przypadku wielu innych konwersji formatu daty, ale ponieważ w tym przypadku po prostu zmieniamy podciągi, jest to kolejny możliwy sposób.


jak przekonwertować 2019-10-28T17: 02: 49Z na znacznik czasu?
Bogdan Bogdanov

1
Zastosowanie strtotime(). :-)
Don't Panic

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

Prosty sposób użycia strtotime()i date():

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

Z czasem

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

0

Użyj date_createidate_format

Spróbuj tego.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.