Konvertieren Sie ein Datumsformat in PHP


489

Ich versuche, ein Datum von yyyy-mm-ddnach zu konvertieren dd-mm-yyyy(aber nicht in SQL). Ich weiß jedoch nicht, wie die Datumsfunktion einen Zeitstempel erfordert, und ich kann keinen Zeitstempel von dieser Zeichenfolge erhalten.

Wie ist das möglich?


21
TT-MM-JJJJ ist das Standardformat in (den meisten) europäischen Ländern, zumindest wenn Sie den Benutzern Daten präsentieren müssen.
Matteo Riva

7
TT-MM-JJJJ auch in Australien und Neuseeland
Jonathan Day

2
MM-TT-JJJJ in den USA. @stesch: Ersteres ist Standard in SQL. Ich bin mir nicht sicher, ob es in irgendeinem Land Standard ist . :)
Herbert

10
Tatsächlich ist der Standard JJJJ-MM-TT gemäß ISO 8601 .
Jezen Thomas

7
Der globale "Standard" lautet JJJJ-MM-TT und sollte nach Möglichkeit immer von Systemen verwendet werden. Der Tag, der Monat und das Jahr der Bestellung werden von Menschen in den meisten Teilen der Welt (außer in den USA) verwendet, normalerweise jedoch mit Schrägstrichen und nicht mit Bindestrichen. Um Verwirrung zu vermeiden, trenne ich JJJJ-MM-TT nur durch Bindestriche. Jedes andere Datumsformat werde ich mit Schrägstrichen trennen. Dies hält die Dinge konsistent.
rjmunro

Antworten:


1056

Verwenden Sie strtotime()und date():

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

(Siehe die Dokumentation zu Zeit und Datum auf der PHP-Site.)

Beachten Sie, dass dies eine schnelle Lösung für die ursprüngliche Frage war. Für umfangreichere Konvertierungen sollten Sie die DateTimeKlasse wirklich zum Parsen und Formatieren verwenden :-)


14
Was ist, wenn ich dieses Datum 0000-00-00 von mySQL bekomme? es gibt ein falsches Datum wie 31/12/1969 zurück ...
Enrique

3
@Enrique: Wenn Sie 000-00-00 von MySQL erhalten, sollten Sie dies zuerst testen, bevor Sie die Konvertierung durchführen. Einfache.
ShadowStorm

1
@SobinAugustine et al.: Strtotime () konvertiert die Datumszeichenfolge in einen "Unix-Zeitstempel (die Anzahl der Sekunden seit dem 1. Januar 1970 00:00:00 UTC)", ein Formatdatum () kann verstehen und dann konvertieren. Dies wird also nicht mit einem Zeitstempel vor 1970 funktionieren.
Samuel Lindblom

1
@ SamuelLindblom nein, es ist nicht so, es wird vor 1970 funktionieren.
Sobin Augustine

1
@SobinAugustine: Du hast recht. Es wird jedoch nicht vor dem 14.12.1901 funktionieren, so dass immer noch gilt, warum die oben aufgeführten Daten nicht funktionieren.
Samuel Lindblom

271

Wenn Sie die strtotime-Konvertierung vermeiden möchten (z. B. kann strtotime Ihre Eingaben nicht analysieren), können Sie Folgendes verwenden:

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

Oder äquivalent:

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

Sie geben ihm zuerst das Format $ dateString. Dann teilen Sie ihm das Format mit, in dem $ newDateString sein soll.

Oder wenn das Quellformat immer "Ymd" (JJJJ-MM-TT) ist, verwenden Sie einfach 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
Vielen Dank für die DateTime::createFromFormat()- es ist wirklich nützlicher alsstrtotime()
Gtx

2
NB: Für die ersten beiden Methoden ist PHP 5.3+ erforderlich.
Salman von Abbas

Vielen Dank für die neue DateTime-Option. Das hat funktioniert und war eine sehr saubere Option.
Nina Morena

1
strtotime()nützlich für die Konvertierung des True-Type- Formats (Ymd) in andere Formate, DateTime::createFromFormat()ist jedoch universell. Es ist wie STR_TO_DATEin MySQL
Taron Saribekyan

Dieser hat wirklich für mich funktioniert Anstelle von Bullshitstrtotime()
Code Cooker

72

Verwenden:

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

Ohne den Aufwand für die Datumskonvertierung bin ich mir nicht sicher, ob es wichtig sein wird.


Ja, antwortete, als Sie Ihre eingereicht haben, glaube ich. Natürlich kann die in strtotime gefundene Fehlerprüfung nützlich sein.
Tim Lytle

2
War nützlich für mich beim Konvertieren des nichtamerikanischen Datumsformats ... TT-MM-JJJJ => JJJJ-MM- TT
Chris Jacob

5
Verstehe nicht, warum diese Antwort weniger Stimmen hat. Es sollte die beste Antwort sein. Es löst das Problem einfach und schnell ohne Probleme. Danke
Naeem Ul Wahhab

2
Sie können es sogar erneut aufrufen, wenn Sie das Datumsformat auf die ursprüngliche Form zurücksetzen müssen. Beste Antwort in der Tat. :)
Pedro Araujo Jorge

1
Dies sollte als akzeptierte Antwort geändert werden. Es behebt alle Datums- und Uhrzeitprobleme bei der Verwendung von Datums- und Datumsformaten.
Matteo Bononi 'Peorthyr'

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

Dieser Code funktioniert für jedes Datumsformat.

Sie können die Reihenfolge der Ersetzungsvariablen wie $ 3- $ 1- $ 2 aufgrund Ihres alten Datumsformats ändern.


Vielen Dank!
Lê Văn Chiến

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

Weitere Informationen finden Sie in der Dokumentation zustrtotime .

Oder noch kürzer:

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

27

Auch eine andere obskure Möglichkeit:

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

Ich weiß nicht ob ich es benutzen würde aber trotzdem :)


1
Ich habe dies letztendlich verwendet, weil in unserer Anwendung "99" eingegeben wurde, wenn eines der Felder (Tag, Monat, Jahr) unbekannt ist. Guter Ansatz, wenn Ihre Daten "falsche" Daten enthalten.
Voodoo

18

Hinweis : Da die Antwort dieses Beitrags manchmal positiv bewertet wird, bin ich hierher zurückgekommen, um die Leute zu bitten, sie nicht mehr zu bewerten. Meine Antwort ist uralt, technisch nicht korrekt, und hier gibt es mehrere bessere Ansätze. Ich behalte es hier nur zu historischen Zwecken.

Obwohl die Dokumentation die strtotime-Funktion schlecht beschreibt, hat @rjmunro das Problem in seinem Kommentar korrekt angesprochen: Es hat das ISO-Format "JJJJ-MM-TT".

Auch wenn meine Date_Converter-Funktion möglicherweise noch funktioniert, möchte ich Sie warnen, dass es unten möglicherweise ungenaue Anweisungen gibt. Ignorieren Sie sie daher bitte.

Die am häufigsten gewählte Antwort ist tatsächlich falsch!

Das PHP strtotime-Handbuch hier besagt, dass "die Funktion erwartet, eine Zeichenfolge mit einem englischen Datumsformat zu erhalten". Was es tatsächlich bedeutet, ist, dass es ein amerikanisches US-Datumsformat wie "mdY" oder "m / d / Y" erwartet.

Dies bedeutet, dass ein als "Ymd" angegebenes Datum möglicherweise von falsch interpretiert wird strtotime. Sie sollten das Datum im erwarteten Format angeben.

Ich habe eine kleine Funktion geschrieben, um Datumsangaben in verschiedenen Formaten zurückzugeben. Verwenden und ändern Sie nach Belieben. Wenn jemand daraus eine Klasse macht, würde ich mich freuen, wenn das geteilt würde.

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
Wenn ich weiter lese, mag ich es, wenn Ceiroa daran festhält. Das ist viel einfacher als das Datum zu explodieren / zu implodieren.
Igor Donin

3
Die Top-Antwort ist nicht falsch. PHP macht das Richtige mit einem ISO-Format Datum "JJJJ-MM-TT". Es kann es nicht als US-Datum falsch interpretieren, da es am Anfang 4 Ziffern hat und - nicht / als Trennzeichen verwendet. ISO-Daten wurden sorgfältig entworfen, um nicht mit anderen Formaten verwechselt zu werden.
rjmunro

14

Es gibt zwei Möglichkeiten, dies umzusetzen:

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

Sie können die strftime()Funktion ausprobieren . Einfaches Beispiel:strftime($time, '%d %m %Y');


8

Verwenden Sie diese Funktion, um von einem beliebigen Format in ein beliebiges Format zu konvertieren

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

Im Folgenden finden Sie PHP-Code zum Generieren des morgigen Datums mit mktime()und Ändern des Formats in das Format TT / MM / JJJJ und Drucken mit echo.

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

5
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));

1
Für MySQL ist das Datumsformat Ymd wie "2014-04-26"
AbdulBasit

2

Sie können das Format mit date () und strtotime () ändern.

$ date = '18.09.2019';

Echodatum ('dm-y', Strtotime ($ date));

Ergebnis:

18-09-19

Wir können das Format ändern, indem wir das (dmy) ändern.


1

Für diese spezielle Konvertierung können wir auch eine Formatzeichenfolge verwenden.

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

Dies funktioniert natürlich nicht für viele andere Datumsformatkonvertierungen, aber da wir in diesem Fall nur Teilzeichenfolgen neu anordnen, ist dies eine andere Möglichkeit, dies zu tun.


Wie konvertiere ich 2019-10-28T17: 02: 49Z in einen Zeitstempel?
Bogdan Bogdanov

1
Verwenden Sie strtotime(). :-)
Keine Panik

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

Einfache Verwendung strtotime()und date():

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

Mit der Zeit

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

0

Verwenden Sie date_createunddate_format

Versuche dies.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.