Converti un formato data in PHP


489

Sto cercando di convertire una data da yyyy-mm-dda dd-mm-yyyy(ma non in SQL); tuttavia non so come la funzione di data richieda un timestamp e non riesco a ottenere un timestamp da questa stringa.

Com'è possibile?


22
gg-mm-aaaa è il formato standard nella (maggior parte) dell'Europa almeno quando è necessario presentare i dati agli utenti.
Matteo Riva,

7
gg-mm-aaaa anche in Australia e Nuova Zelanda
Jonathan Day

2
mm-gg-aaaa negli Stati Uniti. @stesch: il primo è standard in SQL. Non sono sicuro che sia standard in qualsiasi paese. :)
Herbert,

11
In realtà, lo standard è aaaa-mm-gg secondo ISO 8601 .
Jezen Thomas

7
Lo "Standard" globale è yyyy-mm-dd e dovrebbe essere sempre utilizzato dai sistemi ogni volta che è possibile. Il giorno dell'ordine, il mese, l'anno viene utilizzato dalle persone nella maggior parte del mondo (tranne gli Stati Uniti), ma di solito con barre, non trattini. Per evitare confusione, separo solo AAAA-MM-GG con trattini. Qualsiasi altro formato di data che separerò con le barre. Questo mantiene le cose coerenti.
rjmunro,

Risposte:


1057

Usa strtotime()e date():

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

(Vedi la documentazione su strtotime e date sul sito PHP.)

Si noti che questa è stata una soluzione rapida alla domanda originale. Per conversioni più estese, dovresti davvero utilizzare la DateTimeclasse per analizzare e formattare :-)


14
Cosa succede se ottengo questa data di registrazione da mySQL? restituisce una data errata come il 31/12/1969 ...
Enrique,

3
@Enrique: se ricevi MySpace da 000-00-00, dovresti testarlo PRIMA prima di passare alla conversione. Semplici.
ShadowStorm

1
@SobinAugustine et al: strtotime () convertirà la stringa della data in "Timestamp Unix (il numero di secondi dal 1 ° gennaio 00:00:00:00 UTC)", un formato data () in grado di comprendere e quindi convertire da. Quindi questo non funzionerà con un timestamp prima del 1970.
Samuel Lindblom,

1
@SamuelLindblom no, non è così, funzionerà prima del 1970.
Sobin Augustine,

1
@SobinAugustine: hai ragione. Tuttavia, non funzionerà prima del 1901-12-14, quindi vale ancora per il motivo per cui le date sopra elencate non funzionano.
Samuel Lindblom,

272

Se desideri evitare la conversione di strtotime (ad esempio, strtotime non è in grado di analizzare i tuoi input) puoi utilizzare,

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

O, equivalentemente:

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

Prima gli stai dando il formato $ dateString. Quindi gli stai dicendo il formato in cui vuoi $ newDateString.

O se il formato sorgente è sempre "Ymd" (yyyy-mm-dd), usa semplicemente 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
Grazie per DateTime::createFromFormat()- è davvero più utile distrtotime()
Gtx l'

2
NB: PHP 5.3+ richiesto per i primi due metodi.
Salman von Abbas

Grazie per la nuova opzione DateTime. Funzionava ed era un'opzione molto pulita.
Nina Morena,

1
strtotime()utile per convertire il formato di tipo reale (Ymd) in altri formati, ma DateTime::createFromFormat()è universale. È come STR_TO_DATEin MySQL
Taron Saribekyan il

Questo ha funzionato davvero per me invece di stronzatestrtotime()
Code Cooker il

72

Uso:

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

Senza il sovraccarico di conversione della data, non sono sicuro che avrà molta importanza.


Sì, ho risposto quando hai inviato il tuo, credo. Naturalmente il controllo degli errori trovato in strtotime può essere qualcosa di utile.
Tim Lytle,

2
Mi è stato utile nel convertire il formato data non americano ... gg-mm-aaaa => aaaa-mm-gg Vedi php.net/manual/it/datetime.formats.date.php
Chris Jacob

5
Non capire perché questa risposta ha meno voti. Dovrebbe essere la risposta più votata. Risolve il problema in modo semplice e veloce senza problemi. Grazie
Naeem Ul Wahhab il

2
Puoi anche richiamarlo di nuovo se devi invertire il formato della data nella sua forma originale. La migliore risposta davvero. :)
Pedro Araujo Jorge

1
questo dovrebbe essere cambiato come risposta accettata, risolve tutto il problema data-ora dell'uso dei formati data e data.
Matteo Bononi "peorthyr",

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

Questo codice funziona per ogni formato di data.

È possibile modificare l'ordine delle variabili di sostituzione come $ 3- $ 1- $ 2 a causa del vecchio formato della data.


Grazie mille!
Lê Văn Chiến,

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

Per ulteriori informazioni, consultare la documentazione distrtotime .

O ancora più breve:

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

27

Anche un'altra oscura possibilità:

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

Non so se lo userei ma comunque :)


1
Ho finito per usarlo perché nella nostra applicazione, le persone inseriscono "99" se uno dei campi (giorno, mese, anno) è sconosciuto. Buon approccio se hai dei dati "falsi" nei tuoi dati.
Voodoo,

18

Nota : poiché la risposta di questo post a volte viene votata, sono tornato qui per chiedere gentilmente alle persone di non votare più. La mia risposta è antica, non tecnicamente corretta, e ci sono molti approcci migliori proprio qui. Lo tengo qui solo per scopi storici.

Sebbene la documentazione descriva male la funzione strtotime, @rjmunro ha risolto correttamente il problema nel suo commento: è in formato ISO data "AAAA-MM-GG".

Inoltre, anche se la mia funzione Date_Converter potrebbe ancora funzionare, vorrei avvertire che potrebbero esserci delle dichiarazioni imprecise di seguito, quindi per favore ignoratele.

La risposta più votata è in realtà errata!

Il manuale strtotime di PHP qui afferma che "La funzione prevede di ricevere una stringa contenente un formato data inglese". Ciò che significa in realtà è che si aspetta un formato di data statunitense americano, come "mdY" o "m / d / Y".

Ciò significa che una data indicata come "Ymd" potrebbe essere interpretata erroneamente strtotime. È necessario fornire la data nel formato previsto.

Ho scritto una piccola funzione per restituire le date in diversi formati. Utilizzare e modificare a piacimento. Se qualcuno lo trasforma in una classe, sarei felice se questo fosse condiviso.

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
Continuando a leggere, mi piace la correzione di Ceiroa. È molto più facile che esplodere / implodere la data.
Igor Donin,

3
La risposta migliore non è errata. PHP fa la cosa giusta con una data in formato ISO "AAAA-MM-GG". Non può interpretarlo erroneamente come una data USA, perché ha 4 cifre all'inizio e utilizza - non / come separatore. Le date ISO sono state accuratamente progettate per non essere confuse con altri formati.
rjmunro,

14

Esistono due modi per implementare questo:

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

Utilizzare questa funzione per convertire da qualsiasi formato a qualsiasi formato

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

Di seguito è riportato il codice PHP per generare la data di domani usando mktime()e cambiare il suo formato nel formato gg / mm / aaaa e poi stamparlo usando 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
Per Mysql il formato della data è Ymd come "26-04-2014"
AbdulBasit,

2

Puoi cambiare il formato usando date () e strtotime ().

$ date = '18/09/2019';

data dell'eco ('dm-y', strtotime ($ date));

Risultato:

18-09-19

Possiamo cambiare il formato cambiando il (dmy).


1

Per questa conversione specifica possiamo anche usare una stringa di formato.

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

Ovviamente questo non funzionerà per molte altre conversioni del formato della data, ma poiché in questo caso stiamo solo riorganizzando le sottostringhe, questo è un altro modo possibile per farlo.


come convertire 2019-10-28T17: 02: 49Z in data / ora?
Bogdan Bogdanov,

1
Usa strtotime(). :-)
Non

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

Modo semplice Usa strtotime()e date():

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

Col tempo

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

0

Usa date_createedate_format

Prova questo.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.