Converti da MySQL datetime in un altro formato con PHP


447

Ho una datetimecolonna in MySQL.

Come posso convertirlo sul display come mm / gg / aa H: M (AM / PM) usando PHP?


4
Quello che dobbiamo sapere è come la data è memorizzata in SQL. È Timestamp o Datetime o unixtime?
Ólafur Waage,

Sono memorizzati non in un tempo unix, proprio come una data normale, PHP è quello che lo gestisce come secondi e cose del genere. Ti consiglierei di usare le OOPfunzioni datetime di PHP , sono molto facili da usare.
Gucho Ca,

2
Posso consigliarmi e in alternativa al tuo formato data? mm/dd/yyè molto americano, e quelli di noi che vivono in altre parti del mondo diventano più che irritabili nel provare a indovinare cosa si intende per 11-12-13. Lo standard più universale è yyyy-mm-dded è parte dello standard ISO 8601. In caso contrario , è necessario utilizzare il nome del mese , non il numero.
Manngo,

Risposte:


515

Se stai cercando un modo per normalizzare una data nel formato MySQL, usa quanto segue

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

La linea $phpdate = strtotime( $mysqldate )accetta una stringa ed esegue una serie di euristiche per trasformare quella stringa in un timestamp unix.

La linea $mysqldate = date( 'Y-m-d H:i:s', $phpdate )usa quel timestamp e la datefunzione di PHP per riportare quel timestamp nel formato di data standard di MySQL.

( Nota dell'editore : questa risposta è qui a causa di una domanda originale con una formulazione confusa e l'utilità generale di Google fornita da questa risposta anche se non ha risposto direttamente alla domanda che esiste ora)


19
questa risposta confonde l'argomento
Alex K,

5
@ 0xBAADF00D: leggi di nuovo la domanda ... nessuno ha chiesto informazioni sul formato standard MySQL.
user7116,

3
ovviamente, ma, quando esiste lo standard, potrebbe essere bello seguire lo standard (evita il mal di testa in seguito quando un altro sviluppatore lavora sul tuo codice) xD
0xBAADF00D

4
La domanda pone l'output nel formato mm / gg / aa H: M (AM / PM), non "Ymd H: i: s".
Rikki,

6
does not workper chi? La risposta accettata funzionerà se si desidera convertire da MySQL in mm / gg / aa H: M (AM / PM) come richiesto dall'OP. Solo perché si desidera fare il contrario, la risposta accettata non viene errata.
Toxalot,

311

Per convertire una data recuperata da MySQL nel formato richiesto ( mm/dd/yy H:M (AM/PM)):

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

Fare riferimento alle opzioni di formattazione della data PHP per regolare il formato.


Da dove $rowdovrebbe provenire questo oggetto?
Mike

25
Potrei sbagliarmi, ma penso che ad alcuni di voi manchi il punto. Vuole che l'output sia nel formato "m / d / yg: i A", estraendo la data originale da un campo DATETIME. Quindi il suo codice funziona. @Mike $ row-> createate è solo la colonna datetime di Tim.
Mere Development

4
La risposta di @AsTeR è confusa solo se si fraintende la domanda. OP ha risposto alla propria domanda e desidera prendere una data da MySQL e inviarla nel formato richiesto: mm / gg / aa H: M (AM / PM) .
Toxalot,

@TimBoland Penso che la risposta potrebbe essere migliorata se da fosse enfatizzato così come il formato richiesto mm / gg / aa H: M (AM / PM) . E potrebbe beneficiare di un collegamento alla funzione data. Ho provato a suggerire una modifica , ma è stata respinta.
Toxalot,

1
Curiosità: questa risposta è all'incirca equivalente a quella appena sotto (che non ha praticamente alcun voto negativo), ma ha ottenuto> 40 voti negativi perché risponde alla domanda del PO, che differisce da ciò che effettivamente hanno le persone che arrivano a questa pagina.
Clément,

110

Se stai usando PHP 5, puoi anche provare

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");

Come indicato sopra nei commenti, il formato standard è("Y-m-d H:i:s")
Yannickv,

45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

Riferimento: http://php.net/manual/en/function.date.php


Penso che le persone abbiano votato male perché sono confuse riguardo alla domanda OP. La maggior parte legge la domanda come l'opposto di ciò che è realmente. L'altra possibilità è che questo è molto simile alla risposta accettata che è stata pubblicata 5+ anni fa.
Toxalot,

1
Il collegamento a cui fai riferimento non punta alla funzione che stai utilizzando, né spiega il formato. Penso che php.net/function.date.php sarebbe meglio.
Toxalot,

@toxalot La risposta accettata è errata. Modificato dopo la mia risposta e sul mio link, sostituisco il tuo link. Grazie
Tony Stark,

1
Tutta questa domanda ha una storia sordida. La risposta accettata era errata tra il 29 aprile 2013 e il 24 maggio 2013. Era corretta quando hai pubblicato la risposta per la prima volta. La tua risposta è stata sbagliata fino al 29 maggio 2013, dopo di che è diventata molto simile alla risposta accettata.
Toxalot

23

Finalmente la soluzione giusta per PHP 5.3 e versioni successive: (aggiunto il fuso orario opzionale all'esempio come menzionato nei commenti)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');

il suo errore .. Classe 'App \ Controller \ DateTime' non trovata .. usando php 6.4
aswzen

1
Se lavori in un altro spazio dei nomi, devi chiamarlo con una barra rovesciata di fronte:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester,

2
Non dimenticare di specificare il fuso orario quando crei l'oggetto data! In caso contrario, la data formattata potrebbe essere di diverse ore di pausa. Le tue datetimecolonne dovrebbero essere UTF8, quindi passa new DateTimeZone('UTC')come terzo parametro per assicurarti che PHP lo sappia.
Eric Seastrand,

Questa è la risposta corretta che emette il formato desiderato del PO, prenditi cura dei fusi orari
Accountant م

12

Un modo più semplice sarebbe formattare la data direttamente nella query MySQL, anziché in PHP. Vedere la voce del manuale di MySQL per DATE_FORMAT .

Se preferisci farlo in PHP, allora hai bisogno della funzione data , ma prima devi convertire il valore del tuo database in un timestamp.


11
-1 perché la data di formattazione nel DB non è una buona idea. Il Web multilingue richiede diversi formati di data e quindi è necessario formattare la data in PHP (linguaggio di logica aziendale in comune). Quando hai scritto della datefunzione, dovresti scrivere strottimeanche della funzione per aiutare qualcuno invece di "ma prima dovrai convertire il valore del tuo database in un timestamp".
Boris Šuška,

10

Dimentica tutto. Usa solo:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))

9

Per formattare correttamente un DateTimeoggetto in PHP per la memorizzazione in MySQL, utilizzare il formato standardizzato utilizzato da MySQL, ovvero ISO 8601 .

PHP ha questo formato memorizzato come costante dalla versione 5.1.1 e consiglio vivamente di usarlo anziché digitare manualmente la stringa ogni volta.

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

Questo e un elenco di altre costanti di PHP DateTime sono disponibili su http://php.net/manual/en/class.datetime.php#datetime.constants.types


MySQL in realtà non utilizza questo formato e MySQL genera un avviso se si include il designatore del fuso orario "+ xxxx" che viene generato da esso. AGGIORNAMENTO X SET Y = '2014-03-31T15: 00: 00 + 0100' dove Z; Interrogazione OK, 0 righe interessate, 1 avviso (0,06 sec) Righe abbinate: 1 Modificato: 0 Avvertenze: 1
George Lund

OP vuole prendere una data dal formato MySQL e convertirlo in mm / gg / aa H: M (AM / PM) .
Toxalot,

8

Questo dovrebbe formattare un campo in una query SQL:

SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename

È necessario specificare la query MySQL , non solo SQL, perché non funzionerà necessariamente con tutti i database. Mentre OP ha chiesto la soluzione PHP, questa è una buona alternativa che OP potrebbe non conoscere. Tuttavia, ciò non fornirà il formato richiesto. Per ottenere il formato OP richiesto, è necessario '%m/%d/%y %h:%i %p'.
Toxalot,

7

Usa la funzione data :

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>

25
La funzione date () non prevede un timestamp intero anziché un datetime specificato nella domanda?
Loftx,

5

A seconda della configurazione del datetime di MySQL. In genere: formato 2011-12-31 07:55:13 . Questa funzione molto semplice dovrebbe fare la magia:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

O un po 'più di anticipo per abbinare la domanda.

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}

1
Questo non risponde alla domanda OP. OP vuole prendere una data dal formato MySQL e convertirlo in mm / gg / aa H: M (AM / PM) . Inoltre questo formatterà solo l'ora corrente, non una data specifica.
Toxalot,

5
SELECT 
 DATE_FORMAT(demo.dateFrom, '%e.%M.%Y') as dateFrom,
 DATE_FORMAT(demo.dateUntil, '%e.%M.%Y') as dateUntil
FROM demo

Se non vuoi cambiare ogni funzione nel tuo codice PHP, per mostrare il formato della data prevista, cambialo alla fonte - il tuo database.

È importante citare le righe con il quale operatore come nell'esempio precedente (come DateFrom, come dateUntil). I nomi che scrivi lì sono i nomi, le righe verranno chiamate nel tuo risultato.

L'output di questo esempio sarà

[Giorno del mese, numerico (0..31)]. [Nome del mese (gennaio ... dicembre)]. [Anno, numerico, quattro cifre]

Esempio: 5 agosto 2015

Cambia i punti con il separatore scelto e controlla la funzione DATE_FORMAT (data, formato) per altri formati di data.


3

Puoi anche fare in modo che la tua query restituisca l'ora come data / ora Unix. Ciò eliminerebbe la necessità di chiamare strtotime()e rendere le cose un po 'meno intense dal lato PHP ...

select  UNIX_TIMESTAMP(timsstamp) as unixtime from the_table where id = 1234;

Quindi in PHP basta usare la date()funzione per formattarla come preferisci.

<?php
  echo date('l jS \of F Y h:i:s A', $row->unixtime);
?>

o

<?php
  echo date('F j, Y, g:i a', $row->unixtime);
?>

Mi piace questo approccio piuttosto che usare la funzione di MySQLDATE_FORMAT , perché ti permette di riutilizzare la stessa query per catturare i dati e ti permette di modificare la formattazione in PHP.

È fastidioso avere due query diverse solo per cambiare l'aspetto della data nell'interfaccia utente.


Mi piace l'idea di utilizzare UNIX_TIMESTAMPper eliminare la necessità di strtotime. Questa risposta sarebbe migliore se fornisse un esempio di formattazione dell'ora nel formato OP effettivamente richiesto.
Toxalot,

1

Potresti avere problemi con le date non restituite in Unix Timestamp, quindi questo funziona per me ...

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15)))

1
Ciò non converte la data nel formato richiesto dall'OP.
Toxalot,

1

Questo funzionerà ...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));

1
Quel formato si mescola 24 volte con AM / PM. Altrimenti, è la stessa della risposta accettata che è stata pubblicata 5+ anni fa.
Toxalot,

0

Utilizzando PHP versione 4.4.9 e MySQL 5.0, questo ha funzionato per me:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDateè la colonna in MySQL .


Questo non converte la data nel formato richiesto da OP
toxalot il

0

L'approccio che suggerisco funziona come il seguente. Innanzitutto, si crea un oggetto datetime di base da una stringa in formato mysql; e poi lo formatti nel modo che preferisci. Fortunatamente, mysql datetime è conforme a ISO8601, quindi il codice stesso potrebbe apparire abbastanza semplice ed elegante. Tieni presente che quella datetimecolonna non ha informazioni sul fuso orario, quindi devi convertirle in modo appropriato .

Ecco il codice:

(new ISO8601Formatted(
    new FromISO8601('2038-01-19 11:14:07'),
    'm/d/Y h:iA'
))
    ->value();

Produce 01/19/2038 11:14AM- speriamo che cosa ti aspetti.

Questo esempio usa la libreria di meringhe. Puoi verificarne un po 'di più se vuoi.


-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

1
Questo non risponde alla domanda OP. OP vuole prendere una data dal formato MySQL e convertirlo in mm / gg / aa H: M (AM / PM) . Questo fa il contrario. Inoltre, prende input da un modulo anziché dal database.
Toxalot,
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.