2010-01-30 16 views
249

C'è un modo semplice per convertire un formato di data in un altro formato di data in PHP?Convertire un formato data in un altro in PHP

ho questo:

$old_date = date('y-m-d-h-i-s');   // works 

$middle = strtotime($old_date);    // returns bool(false) 

$new_date = date('Y-m-d H:i:s', $middle); // returns 1970-01-01 00:00:00 

ma mi piacerebbe ovviamente come a restituire una data corrente, piuttosto che il crack 'o all'alba. Che cosa sto facendo di sbagliato?

+0

http://tech-blog.maddyzone.com/php/type-date-convert-php articolo molto bello –

risposta

229

Il secondo parametro su date() deve essere un timestamp corretto (secondi dal 1 ° gennaio 1970). Stai passando una stringa, che la data() non può riconoscere.

È possibile utilizzare strtotime() per convertire una stringa di data in un timestamp. Tuttavia, anche strtotime() non riconosce il formato y-m-d-h-i-s.

PHP 5.3 e fino

Usa DateTime::createFromFormat. Permette di specificare una maschera esatta - usando la sintassi date() - per analizzare le date della stringa in entrata con.

PHP 5.2 e inferiori

Si dovrà analizzare gli elementi (anno, mese, giorno, ora, minuti, secondi) utilizzando manualmente substr() e consegnare i risultati a mktime() che costruiranno un timestamp.

Ma è molto lavoro! Raccomando di usare un formato diverso che strftime() possa capire. strftime() capisce qualsiasi immissione data breve a the next time joe will slip on the ice. per esempio, questo funziona:

$old_date = date('l, F d y h:i:s');    // returns Saturday, January 30 10 02:06:34 
$old_date_timestamp = strtotime($old_date); 
$new_date = date('Y-m-d H:i:s', $old_date_timestamp); 
+0

Grazie Pekka, appena modificato la mia domanda, provato che ma doesnt sembrano funzionare. – Tom

+0

Ho modificato la risposta mentre la accettavi :) Ho aggiunto altri esempi e riferimenti. –

+0

Gotcha, questo è davvero il problema. È un nome di file fisso che ho bisogno di riconvertire in una data (deve essere in quel formato), quindi troverò una soluzione alternativa. – Tom

3

È necessario convertire il $ OLD_DATE di nuovo in un timestamp, come il date function richiede un timestamp come secondo argomento.

21

Prova questo:

$old_date = date('y-m-d-h-i-s'); 
$new_date = date('Y-m-d H:i:s', strtotime($old_date)); 
+0

Non funziona, strtotime() non riconosce il formato. Appena provato –

+0

concordato, ho appena inserito il codice del formato dall'indagente, dovrebbe essere specificato il formato corretto. – Sarfraz

+0

Ha funzionato per me. Il mio $ old_date era qualcosa del genere 2012-05-22T19: 16: 37 + 01: 00. Grazie a proposito! – VishwaKumar

7
$old_date = date('y-m-d-h-i-s');  // works 

si sta facendo male qui, questo dovrebbe essere

$old_date = date('y-m-d h:i:s');  // works 

separatore di tempo è ':'


penso che questo aiuterà ...

$old_date = date('y-m-d-h-i-s');    // works 

preg_match_all('/(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)/', $old_date, $out, PREG_SET_ORDER); 
$out = $out[0]; 
$time = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]); 

$new_date = date('Y-m-d H:i:s', $time); 

O


$old_date = date('y-m-d-h-i-s');    // works 

$out = explode('-', $old_date); 
$time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]); 

$new_date = date('Y-m-d H:i:s', $time); 
+0

Sì, certo grazie, è un nome file GUID che voglio riconvertire in un formato data appropriato. – Tom

78

Il modo più semplice per farlo è

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

Stai prima dandogli il formato $ dateString è. Poi si sta dicendo che il formato vuoi aggiungere $ newDateString.

Questo evita anche l'uso di strtotime, che può essere difficile da lavorare a volte.

Se non si sta trasformando da un formato della data ad un altro, ma semplicemente desidera che la data corrente (o datetime) in un formato specifico, allora è ancora più facile:

$now = new DateTime(); 
$timestring = $now->format('Y-m-d h:i:s'); 

Quest'altra domanda si riferisce anche allo stesso argomento: Convert date format yyyy-mm-dd => dd-mm-yyyy.

+0

E come è un duplicato se ho fatto la domanda prima di quello a cui ti stai riferendo? – Tom

+1

Ho modificato la risposta. Volevo solo sottolineare che queste due domande dovrebbero essere collegate in qualche modo. – ceiroa

+0

disponibile su php 5.3+ – Zorox

9

Per convertire $date da dd-mm-yyyy hh:mm:ss ad una vera e propria MySQL datetime vado in questo modo:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s'); 
+2

Non dovresti concatenare questi metodi se non sei sicuro al 110% che $ date sia una data valida e adatta al formato. Detto questo, verrà restituita una data non valida che non corrisponde esattamente al formato: Errore irreversibile: chiamata a un formato funzione membro() su un non oggetto'. Solo un avviso! –

+0

È vero, una soluzione migliore è farlo in 3 passaggi con un controllo Null come passaggio intermedio. –

4

strtotime funzionerà che fuori. le date non sono le stesse e sono tutte nel formato US.

<?php 
$e1 = strtotime("2013-07-22T12:00:03Z"); 
echo date('y.m.d H:i', $e1); 
echo "2013-07-22T12:00:03Z"; 

$e2 = strtotime("2013-07-23T18:18:15Z"); 
echo date ('y.m.d H:i', $e2); 
echo "2013-07-23T18:18:15Z"; 

$e1 = strtotime("2013-07-21T23:57:04Z"); 
echo date ('y.m.d H:i', $e2); 
echo "2013-07-21T23:57:04Z"; 
?> 
34

Le basi

Il modo simplist per convertire un formato della data in un altro è quello di utilizzare strtotime() con date(). strtotime() convertirà la data in Unix Timestamp. Quindi Unix Timestamp può essere passato a date() per convertirlo nel nuovo formato.

$timestamp = strtotime('2008-07-01T22:35:17.02'); 
$new_date_format = date('Y-m-d H:i:s', $timestamp); 

O come un one-liner:

$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02')); 

Tenete a mente che strtotime() richiede la data di essere in un valid format. Se non si fornisce un formato valido, verrà restituito il valore false strtotime() che causerà la data tra il 1969-12 e il 3131.

Utilizzando DateTime()

partire da PHP 5.2, PHP offerto la classe DateTime() che ci offre gli strumenti più potenti per lavorare con date (e tempo). Siamo in grado di riscrivere il codice di cui sopra utilizzando DateTime() come così:

$date = new DateTime('2008-07-01T22:35:17.02'); 
$new_date_format = $date->format('Y-m-d H:i:s'); 

Lavorare con Unix timestamp

date() prende un timeatamp Unix come secondo parametro e restituisce una data formattata per voi:

$new_date_format = date('Y-m-d H:i:s', '1234567890'); 

DateTime() funziona con timestamp Unix aggiungendo un @ prima del timestamp:

Se il timestamp è in millisecondi (può terminare in 000 e/o il timestamp è di tredici caratteri) è necessario convertirlo in secondi prima di poterlo convertire in un altro formato.Ci sono due modi per farlo:

  • Trim le ultime tre cifre fuori usando substr()

Taglio le ultime tre cifre possono essere acheived diversi modi, ma utilizzando substr() è il più facile:

$timestamp = substr('1234567899000', -3); 
  • Dividere il substr per 1000

è possibile anche convertire il timestamp in secondi dividendo per 1000. Poiché il timestamp è troppo grande per sistemi a 32 bit di fare matematica in è necessario utilizzare la libreria BCMath fare la matematica come stringhe:

$timestamp = bcdiv('1234567899000', '1000'); 

Per ottenere un timestamp Unix è possibile utilizzare strtotime() che restituisce un timestamp Unix:

$timestamp = strtotime('1973-04-18'); 

Con DateTime() è possibile utilizzare DateTime::getTimestamp()

$date = new DateTime('2008-07-01T22:35:17.02'); 
$timestamp = $date->getTimestamp(); 

Se stai usando PHP 5.2 è possibile utilizzare l'opzione U formattazione invece:

$date = new DateTime('2008-07-01T22:35:17.02'); 
$timestamp = $date->format('U'); 

Lavorare con formati non standard e data ambiguo

Purtroppo non tutte le date che uno sviluppatore deve lavorare con sono in un formato standard. Fortunatamente PHP 5.3 ci ha fornito una soluzione per questo. DateTime::createFromFormat() ci consente di indicare a PHP in che formato è inserita una stringa di data in modo che possa essere analizzata correttamente in un oggetto DateTime per ulteriori manipolazioni.

$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM'); 
$new_date_format = $date->format('Y-m-d H:i:s'); 

In PHP 5.4 abbiamo ottenuto la possibilità di fare l'accesso membro della classe su di un'istanza è stato aggiunto che ci permette di trasformare il nostro codice DateTime() in un one-liner:

$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s'); 

$new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s'); 
2

Prova questo:

$tempDate = explode('-','03-23-15'); 
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1]; 
7

Quanto segue è un metodo semplice per convertire date in diversi formati.

// Create a new DateTime object 
$date = DateTime::createFromFormat('Y-m-d', '2016-03-25'); 

// Output the date in different formats 
echo $date->format('Y-m-d')."\n"; 
echo $date->format('d-m-Y')."\n"; 
echo $date->format('m-d-Y')."\n"; 
-1

Solo utilizzando stringhe, per me è una buona soluzione, meno problemi con mysql. Rileva il formato corrente e lo modifica se necessario, questa soluzione è solo per il formato spagnolo/francese e il formato inglese, senza utilizzare la funzione datetime di php.

class dateTranslator { 

public static function translate($date, $lang) { 
     $divider = ''; 

     if (empty($date)){ 
      return null; 
     } 
     if (strpos($date, '-') !== false) { 
      $divider = '-'; 
     } else if (strpos($date, '/') !== false) { 
      $divider = '/'; 
     } 
     //spanish format DD/MM/YYYY hh:mm 
     if (strcmp($lang, 'es') == 0) { 

      $type = explode($divider, $date)[0]; 
      if (strlen($type) == 4) { 
       $date = self::reverseDate($date,$divider); 
      } 
      if (strcmp($divider, '-') == 0) { 
       $date = str_replace("-", "/", $date); 
      } 
     //english format YYYY-MM-DD hh:mm 
     } else { 

      $type = explode($divider, $date)[0]; 
      if (strlen($type) == 2) { 

       $date = self::reverseDate($date,$divider); 
      } 
      if (strcmp($divider, '/') == 0) { 
       $date = str_replace("/", "-", $date); 

      } 
     } 
     return $date; 
} 

public static function reverseDate($date) { 
     $date2 = explode(' ', $date); 
     if (count($date2) == 2) { 
      $date = implode("-", array_reverse(preg_split("/\D/", $date2[0]))) . ' ' . $date2[1]; 
     } else { 
      $date = implode("-", array_reverse(preg_split("/\D/", $date))); 
     } 

     return $date; 
} 

USO

dateTranslator::translate($date, 'en') 
0

Questo è l'altro modo è possibile convertire il formato della data

<?php 
$pastDate = "Tuesday 11th October, 2016"; 
$pastDate = str_replace(",","",$pastDate); 

$date = new DateTime($pastDate); 
$new_date_format = $date->format('Y-m-d'); 

echo $new_date_format.' 23:59:59'; ?> 
0

In questo modo nativo aiuterà a convertire qualsiasi formato immesso nel formato desiderato.

$formatInput = 'd-m-Y'; //Give any format here, this would be converted into your format 
$dateInput = '01-02-2018'; //date in above format 

$formatOut = 'Y-m-d'; // Your format 
$dateOut = DateTime::createFromFormat($formatInput, $dateInput)->format($formatOut); 
Problemi correlati