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?

matthy
quelle
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 :-)

Reichtum
quelle
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
?>
Ceiroa
quelle
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.

Tim Lytle
quelle
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.

Alper Sarı
quelle
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));
Kevin
quelle
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 :)

Gabriel
quelle
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
Igor Donin
quelle
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');
Raja Ram T.
quelle
9

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

Sinan
quelle
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);
}
Juancho Ramone
quelle
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);
Vishnu
quelle
5
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));
AbdulBasit
quelle
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.

Varun PV
quelle
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.

Keine Panik
quelle
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
André Rodrigues
quelle
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));
Sani Kamal
quelle
0

Verwenden Sie date_createunddate_format

Versuche dies.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Quatban Taco
quelle