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?

matty
źródło
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 :-)

bogactwo
źródło
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
?>
ceiroa
źródło
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.

Tim Lytle
źródło
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
2
Przydało
Chris Jacob
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.

Alper Sarı
źródło
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));
Kevin
źródło
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 :)

Gabriel
źródło
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
Igor Donin
źródło
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');
Raja Ram T.
źródło
9

Możesz wypróbować tę strftime()funkcję. Prosty przykład:strftime($time, '%d %m %Y');

Sinan
źródło
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);
}
Juancho Ramone
źródło
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);
Wisznu
źródło
5
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));
AbdulBasit
źródło
1
Dla MySQL format daty to Ymd jak „2014-04-26”
AbdulBasit
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).

Varun PV
źródło
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.

Nie panikuj
źródło
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
André Rodrigues
źródło
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));
Sani Kamal
źródło
0

Użyj date_createidate_format

Spróbuj tego.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Quatban Taco
źródło