Domanda

C'è un modo semplice per convertire una data in formato in un altro formato data 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, naturalmente, come per la restituzione di una data corrente, piuttosto che il "crack" o all'alba.Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Il secondo parametro per date() ha bisogno di essere un timestamp corretto (secondi dal 1 ° gennaio 1970). Si passa una stringa, che data () non può riconoscere.

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

PHP 5.3 e fino

DateTime::createFromFormat . Esso consente di specificare una maschera precisa - utilizzando la sintassi date() -. Analizzare le date di stringa in arrivo con

PHP 5.2 e abbassare

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

Ma questo è un sacco di lavoro! Mi consiglia di utilizzare un formato diverso che strftime () può capire. strftime () capisce qualsiasi di data breve ingresso del 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);   

Altri suggerimenti

Il modo più semplice per farlo è

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

Per prima cosa verranno dandogli il formato $ dateString è. Poi si sta dicendo che il formato che si desidera $ newDateString essere in.

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

Se non si sta trasformando da un formato ad un altro appuntamento, ma vuole solo 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');

Questa altra domanda si riferisce anche allo stesso soggetto: Converti formato data aaaa-mm-gg => gg-mm-aaaa .

Le nozioni di base

Il modo simplist per convertire un formato della data in un altro è quello di utilizzare strtotime() date() . strtotime() convertirà la data in un Unix timestamp . Che unix timestamp può quindi 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'));

tenere a mente che strtotime() richiede la data di essere in un valida formato . La mancata presentazione di un formato valido comporterà strtotime() ritorno falso che farà sì che la data per essere 1969/12/31.

Utilizzo DateTime()

A partire da PHP 5.2, PHP offerto il href="http://docs.php.net/manual/en/class.datetime.php" rel="noreferrer"> DateTime() classe DateTime() come:

$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 Unix timestamp con l'aggiunta di un @ prima del timestamp:

$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');

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

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

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

È anche possibile convertire il timestamp in secondi dividendo per 1000. Poiché il timestamp è troppo grande per sistemi a 32 bit di fare matematica su di voi sarà necessario utilizzare il BCMath biblioteca per 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 di formattazione U invece:

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

Lavorare con i formati di data ambigui non standard e

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 permette di dire PHP quale formato una stringa data è in modo da può essere analizzato con successo 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 acquisito la capacità 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');

Prova questo:

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

Per convertire $date da dd-mm-yyyy hh:mm:ss ad una corretta datetime MySQL Vado in questo modo:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
$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 è ':'


Credo che questo vi 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); 

Il seguente è un metodo semplice per convertire le date per 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";

È necessario convertire il $ di nuovo OLD_DATE in un timestamp, come il href="http://www.php.net/manual/en/function.date.php" funzione di data richiede un timestamp come secondo argomento.

strtotime funzionerà che fuori. le date non sono solo lo stesso e tutto in noi formato.

<?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";
?>

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);

Prova questo:

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

Questa risolto per me,

$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;

Output: 2018/4/18

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'; ?>

Basta con le stringhe, per me è una buona soluzione, meno problemi con mysql. Rileva il formato corrente e modifica, se necessario, questa soluzione è solo per il formato spagnolo / francese e il formato inglese, senza l'uso php datetime funzione.

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;
 }

USE

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

So che questo è vecchio, ma, in esecuzione in un fornitore che utilizza in modo incoerente 5 diversi formati di data nella loro API (e server di prova con una varietà di versioni di PHP da 5 di attraverso le 7 del più recente), ho deciso di scrivere un convertitore universale che funziona con una miriade di versioni di PHP.

Questo convertitore avrà praticamente qualsiasi ingresso, compreso qualsiasi formato datetime standard (tra cui, con o senza millisecondi) e alcuna dichiarazione Epoch Time (anche con o senza millisecondi) e convertirlo in qualsiasi altro formato .

Per lo chiamano:

$TheDateTimeIWant=convertAnyDateTome_toMyDateTime([thedateIhave],[theformatIwant]);

L'invio nullo per il formato farà la funzione di restituire il datetime in epoca / Tempo Unix. In caso contrario, inviare qualsiasi stringa di formato tale data () supporti, nonché con ".U" per millisecondi (mi occupo di millisecondi e, anche se la data () restituisce zeri).

Ecco il codice:

        <?php   
        function convertAnyDateTime_toMyDateTime($dttm,$dtFormat)
        {
            if (!isset($dttm))
            {
                return "";
            }
            $timepieces = array();
            if (is_numeric($dttm))
            {
                $rettime=$dttm;
            }
            else
            {
                $rettime=strtotime($dttm);
                if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))>0)
                {
                    $rettime=$rettime.substr($dttm,strpos($dttm,"."),strpos($dttm,"-",strpos($dttm,"."))-strpos($dttm,"."));
                    $timepieces[1]="";
                }
                else if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))==0)
                {               
                    preg_match('/([0-9]+)([^0-9]+)/',substr($dttm,strpos($dttm,"."))." ",$timepieces);
                    $rettime=$rettime.".".$timepieces[1];
                }
            }

            if (isset($dtFormat))
            {
                // RETURN as ANY date format sent
                if (strpos($dtFormat,".u")>0)       // Deal with milliseconds
                {
                    $rettime=date($dtFormat,$rettime);              
                    $rettime=substr($rettime,0,strripos($rettime,".")+1).$timepieces[1];                
                }
                else                                // NO milliseconds wanted
                {
                    $rettime=date($dtFormat,$rettime);
                }
            }
            else
            {
                // RETURN Epoch Time (do nothing, we already built Epoch Time)          
            }
            return $rettime;    
        }
    ?>

Ecco alcune chiamate di esempio - si nota in cui gestisce anche tutti i dati di fuso orario (anche se, come notato sopra, ogni volta che non GMT viene restituito nel tuo fuso orario).

        $utctime1="2018-10-30T06:10:11.2185007-07:00";
        $utctime2="2018-10-30T06:10:11.2185007";
        $utctime3="2018-10-30T06:10:11.2185007 PDT";
        $utctime4="2018-10-30T13:10:11.2185007Z";
        $utctime5="2018-10-30T13:10:11Z";
        $dttm="10/30/2018 09:10:11 AM EST";

        echo "<pre>";
        echo "<b>Epoch Time to a standard format</b><br>";
        echo "<br>Epoch Tm: 1540905011    to STD DateTime     ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","Y-m-d H:i:s")."<hr>";
        echo "<br>Epoch Tm: 1540905011          to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","c");
        echo "<br>Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011.2185007","c")."<hr>";
        echo "<b>Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)";
        echo "</b><br>";
        echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,null);
        echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,null);
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,null);
        echo "<br>UTCTime4: ".$utctime4."      ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime4,null);
        echo "<br>UTCTime5: ".$utctime5."              ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime5,null);
        echo "<br>NO MILIS: ".$dttm."        ----RESULT: ".convertAnyDateTime_toMyDateTime($dttm,null);
        echo "<hr>";
        echo "<hr>";
        echo "<b>Returned as whatever datetime format one desires</b>";
        echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,"Y-m-d H:i:s")."              Y-m-d H:i:s";
        echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
        echo "<p><b>Returned as ISO8601</b>";
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"c")."        ISO8601";
        echo "</pre>";

Ecco l'output:

Epoch Tm: 1540905011                        ----RESULT: 2018-10-30 09:10:11

Epoch Tm: 1540905011          to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)

UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 1540905011.2185007
UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 1540894211.2185007
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 1540905011.2185007
UTCTime4: 2018-10-30T13:10:11.2185007Z      ----RESULT: 1540905011.2185007
UTCTime5: 2018-10-30T13:10:11Z              ----RESULT: 1540905011
NO MILIS: 10/30/2018 09:10:11 AM EST        ----RESULT: 1540908611
Returned as whatever datetime format one desires
UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 2018-10-30 09:10:11              Y-m-d H:i:s
UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 2018-10-30 06:10:11.2185007      Y-m-d H:i:s.u
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30 09:10:11.2185007      Y-m-d H:i:s.u
Returned as ISO8601
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30T09:10:11-04:00        ISO8601

L'unica cosa che non in questa versione è la possibilità di selezionare il fuso orario che si desidera che il restituito datetime di essere in. In origine, ho scritto questo di cambiare qualsiasi datetime per Epoch Tempo, supporto del fuso orario così, non ho bisogno . E 'banale da aggiungere però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top