Come convertire la data in data e ora in PHP?


Risposte:


612


Questo metodo funziona sia su Windows che su Unix ed è compatibile con il fuso orario , che è probabilmente quello che vuoi se lavori con le date .

Se non ti interessa il fuso orario o desideri utilizzare il fuso orario utilizzato dal tuo server:

$d = DateTime::createFromFormat('d-m-Y H:i:s', '22-09-2008 00:00:00');
if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093324 (Questo differirà in base al fuso orario del tuo server ...)


Se si desidera specificare in quale fuso orario, qui EST. (Come a New York.)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('EST')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093305


O se vuoi usare UTC . (Come per " GMT ".)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('UTC')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093289


Indipendentemente da ciò, è sempre un buon punto di partenza essere rigorosi quando si analizzano stringhe in dati strutturati. Può salvare il debug scomodo in futuro. Pertanto consiglio di specificare sempre il formato della data.


2
Elegante. Me ne ero dimenticato!
Fino al

53
Come mai non hai ancora ottenuto il credito per questa risposta ?!
Mark Tomlin,

4
Una risposta completamente valida, ma sono sorpreso dal fatto che la risposta di Armin Ronacher non l'abbia abbinata nei voti positivi: l'ambiguità è SEMPRE negativa.
RonLugge

1
@Devner Bene, sembra che sul mio server quel formato non sia supportato. Forse è diverso con il tuo.
Lucas,

1
Questa soluzione può portare a un comportamento imprevisto. Coloro che usano PHP 5.3+ dovrebbero adottare la risposta del Prof. Falken , in cui si ha il pieno controllo del formato della data.
Luca Fagioli,

185

C'è anche strptime () che prevede esattamente un formato:

$a = strptime('22-09-2008', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900);

4
dovrebbe essere tm_mon invece di tm_month e tm_mday anziché tm_day
amarillion

68
Attenzione, la funzione strptime non è disponibile su Windows.
Comprendere

12
Quelli su Windows e PHP 5.3.0+, considerano l'utilizzo date_parse_from_formatinvece di strptime.
Erwin Wessels,

1
... perché strptimenon è implementato su piattaforme Windows.
Randell,

Dal momento che questa è una risposta molto votata, prenderesti in considerazione la modifica in una risposta che funziona su PHP per Windows e unixen? E IMHO idealmente dovrebbe menzionare i fusi orari.
contratto del Prof. Falken è stato violato

126

Con DateTimeAPI :

$dateTime = new DateTime('2008-09-22'); 
echo $dateTime->format('U'); 

// or 

$date = new DateTime('2008-09-22');
echo $date->getTimestamp();

Lo stesso con l'API procedurale:

$date = date_create('2008-09-22');
echo date_format($date, 'U');

// or

$date = date_create('2008-09-22');
echo date_timestamp_get($date);

Se quanto sopra fallisce perché stai utilizzando un formato non supportato , puoi usarlo

$date = DateTime::createFromFormat('!d-m-Y', '22-09-2008');
echo $dateTime->format('U'); 

// or

$date = date_parse_from_format('!d-m-Y', '22-09-2008');
echo date_format($date, 'U');

Notare che se non si imposta !, la porzione di tempo verrà impostata sull'ora corrente, che è diversa dalle prime quattro che useranno la mezzanotte quando si omette l'ora.

Un'altra alternativa è usare l' IntlDateFormatterAPI:

$formatter = new IntlDateFormatter(
    'en_US',
    IntlDateFormatter::FULL,
    IntlDateFormatter::FULL,
    'GMT',
    IntlDateFormatter::GREGORIAN,
    'dd-MM-yyyy'
);
echo $formatter->parse('22-09-2008');

A meno che tu non stia lavorando con stringhe di date localizzate, la scelta più semplice è probabilmente DateTime.


15
Consiglierei questo oltre alla mia risposta al giorno d'oggi.
Fino

Arggg. ! Non dimenticare che il ! timestamp basato su La mia data stava cambiando ad ogni aggiornamento e mi stava facendo impazzire - perché DateTime stava utilmente aggiungendo l'ora corrente senza chiedere o essere detto. Grrr.

Voglio aggiungere che raccomando contro l'analisi ambigua della data e che il formato della data dovrebbe essere esplicitamente indicato durante l'analisi delle stringhe di date.
contratto del Prof. Falken è stato violato

114

Fai attenzione a funzioni come strtotime()quelle, cerca di "indovinare" ciò che intendi (non indovina, le regole sono qui ).

Effettivamente 22-09-2008verrà analizzato il 22 settembre 2008 , in quanto è l'unica cosa ragionevole.

Come verrà 08-09-2008analizzato? Probabilmente il 09 agosto 2008 .

Che dire 2008-09-50? Alcune versioni di PHP analizzano questo come 20 ottobre 2008 .

Quindi, se sei sicuro che il tuo input sia in DD-MM-YYYYformato, è meglio usare la soluzione offerta da @Armin Ronacher .


5
Preoccupazione valida. Immagino che strtotime () si basi sulla tua lingua.
Fino al

13
Nota: nella maggior parte dei paesi di lingua non inglese, il formato è dd-mm-yyyyno mm-dd-yyyy.
Camilo Martin,

1
@CamiloMartin La maggior parte dei paesi di lingua non inglese utilizza il primo formato indicato, ma il DB in genere memorizza la data in YYYY-mm-ddLa conversione avviene solo per essere visualizzata agli utenti
Danny22

@DannyG ha appena esaminato i documenti e sembra che tu abbia ragione se per DB intendi MySQL. Ma sembra ridicolo farlo ...
Camilo Martin,

57


Questo metodo funziona sia su Windows che su Unix ed è compatibile con il fuso orario , che è probabilmente quello che vuoi se lavori con le date .

Se non ti interessa il fuso orario o desideri utilizzare il fuso orario utilizzato dal tuo server:

$d = DateTime::createFromFormat('d-m-Y H:i:s', '22-09-2008 00:00:00');
if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093324 (Questo differirà in base al fuso orario del tuo server ...)


Se si desidera specificare in quale fuso orario, qui EST. (Come a New York.)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('EST')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093305


O se vuoi usare UTC . (Come per " GMT ".)

$d = DateTime::createFromFormat(
    'd-m-Y H:i:s',
    '22-09-2008 00:00:00',
    new DateTimeZone('UTC')
);

if ($d === false) {
    die("Incorrect date string");
} else {
    echo $d->getTimestamp();
}

1222093289


Indipendentemente da ciò, è sempre un buon punto di partenza essere rigorosi quando si analizzano stringhe in dati strutturati. Può salvare il debug scomodo in futuro. Pertanto consiglio di specificare sempre il formato della data.


Ehi Falken, sei il benvenuto. Tuttavia è probabilmente meglio specificare che questa soluzione si applica a PHP 5.3+
Luca Fagioli il

43

Utilizzando mktime :

list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);

Questo è quello che ho sempre fatto. Esploderlo su - o / o. o qualunque cosa sia separata, quindi mktime.
Rich Bradshaw,

1
C'è una nota nel manuale di PHP per l'ultimo parametro della funzione mktime: "A partire da PHP 5.1.0, questo parametro è diventato obsoleto. Di conseguenza, al suo posto dovrebbero essere utilizzate le nuove funzionalità di gestione del fuso orario". Devo ancora scoprire quali sono le nuove funzionalità di cui parlano, dato che non sono collegate ad essa!
Altamente irregolare, l'

Questo è molto meglio di strtotime()Per qualche motivo strtotime()non funziona in determinate date ed è quindi molto inaffidabile.
dspacejs,

17

Usando la funzione strtotime () puoi facilmente convertire la data in timestamp

<?php
// set default timezone
date_default_timezone_set('America/Los_Angeles');

//define date and time
$date = date("d M Y H:i:s");

// output
echo strtotime($date);
?> 

Maggiori informazioni: http://php.net/manual/en/function.strtotime.php

Strumento di conversione online: http://freeonlinetools24.com/


Per i futuri lettori - strtotime () è stato un incidente e il suo utilizzo non dovrebbe essere incoraggiato. È ambiguo, perché cerca di indovinare il formato della data. Anche se lo usi correttamente, rende il tuo codice più difficile da capire e ragionare e corri il rischio di apportare una modifica alla tua base di codice che introdurrà errori, perché non importa cosa dai a strtotime (), renderà è meglio indovinare. Questa ipotesi potrebbe essere errata, ma non otterrai alcuna indicazione che sia stata indovinata in modo errato. È una pistola. Usalo se vuoi, ma gli utenti alle prime armi possono usare un avvertimento, penso. Attenzione: avanti con la pistola
contratto del Prof. Falken violato

12

Ecco una soluzione molto semplice ed efficace che utilizza le funzioni splite mtime:

$date="30/07/2010 13:24"; //Date example
list($day, $month, $year, $hour, $minute) = split('[/ :]', $date); 

//The variables should be arranged according to your date format and so the separators
$timestamp = mktime($hour, $minute, 0, $month, $day, $year);
echo date("r", $timestamp);

Ha funzionato come un incanto per me.


Nota che split () ora è deprecato, ma se stai usando una versione precedente di php, funziona alla grande!
Hugo H,

6

Dato che la funzione strptime()non funziona per Windows e strtotime()può restituire risultati imprevisti, si consiglia di utilizzare date_parse_from_format():

$date = date_parse_from_format('d-m-Y', '22-09-2008');
$timestamp = mktime(0, 0, 0, $date['month'], $date['day'], $date['year']);

2
Nota: con strtotime (): il separatore è una barra (/), quindi si assume l'americano m / d / y; mentre se il separatore è un trattino (-) o un punto (.), si assume il formato dmy europeo. Quindi penso che non sia necessario usare strptime ()
secretlm

6

Se vuoi sapere con certezza se una data viene analizzata in qualcosa che ti aspetti, puoi usare DateTime::createFromFormat():

$d = DateTime::createFromFormat('d-m-Y', '22-09-2008');
if ($d === false) {
    die("Woah, that date doesn't look right!");
}
echo $d->format('Y-m-d'), PHP_EOL;
// prints 2008-09-22

È ovvio in questo caso, ma ad esempio 03-04-2008potrebbe essere il 3 aprile o il 4 marzo a seconda di dove vieni :)


1
DateTime::createFromFormat ritorna falsein caso di errore , no null.
Aprire il

5

Se conosci il formato usa strptimeperché strtotimefa un'ipotesi per il formato, che potrebbe non essere sempre corretto. Poiché strptimenon è implementato in Windows, esiste una funzione personalizzata

Ricorda che il valore di ritorno tm_yearè del 1900! ed tm_monthè 0-11

Esempio:

$a = strptime('22-09-2008', '%d-%m-%Y');
$timestamp = mktime(0, 0, 0, $a['tm_mon']+1, $a['tm_mday'], $a['tm_year']+1900)




3
function date_to_stamp( $date, $slash_time = true, $timezone = 'Europe/London', $expression = "#^\d{2}([^\d]*)\d{2}([^\d]*)\d{4}$#is" ) {
    $return = false;
    $_timezone = date_default_timezone_get();
    date_default_timezone_set( $timezone );
    if( preg_match( $expression, $date, $matches ) )
        $return = date( "Y-m-d " . ( $slash_time ? '00:00:00' : "h:i:s" ), strtotime( str_replace( array($matches[1], $matches[2]), '-', $date ) . ' ' . date("h:i:s") ) );
    date_default_timezone_set( $_timezone );
    return $return;
}

// expression may need changing in relation to timezone
echo date_to_stamp('19/03/1986', false) . '<br />';
echo date_to_stamp('19**03**1986', false) . '<br />';
echo date_to_stamp('19.03.1986') . '<br />';
echo date_to_stamp('19.03.1986', false, 'Asia/Aden') . '<br />';
echo date('Y-m-d h:i:s') . '<br />';

//1986-03-19 02:37:30
//1986-03-19 02:37:30
//1986-03-19 00:00:00
//1986-03-19 05:37:30
//2012-02-12 02:37:30

3
<?php echo date('U') ?>

Se lo si desidera, inserirlo in un timestamp del tipo di input MySQL . Quanto sopra funziona molto bene (solo in PHP 5 o successivo):

<?php $timestamp_for_mysql = date('c') ?>

3

Ecco come lo farei:

function dateToTimestamp($date, $format, $timezone='Europe/Belgrade')
{
    //returns an array containing day start and day end timestamps
    $old_timezone=date_timezone_get();
    date_default_timezone_set($timezone);
    $date=strptime($date,$format);
    $day_start=mktime(0,0,0,++$date['tm_mon'],++$date['tm_mday'],($date['tm_year']+1900));
    $day_end=$day_start+(60*60*24);
    date_default_timezone_set($old_timezone);
    return array('day_start'=>$day_start, 'day_end'=>$day_end);
}

$timestamps=dateToTimestamp('15.02.1991.', '%d.%m.%Y.', 'Europe/London');
$day_start=$timestamps['day_start'];

In questo modo, fai sapere alla funzione quale formato di data stai usando e persino specifichi il fuso orario.


0

Si prega di fare attenzione all'ora / fuso orario se lo si imposta per salvare le date nel database, poiché ho riscontrato un problema quando ho confrontato le date da mysql convertite in timestamputilizzostrtotime . devi usare esattamente lo stesso fuso orario / fuso prima di convertire la data in data / ora, altrimenti strtotime () utilizzerà il fuso orario predefinito del server.

Vedi questo esempio: https://3v4l.org/BRlmV

function getthistime($type, $modify = null) {
    $now = new DateTime(null, new DateTimeZone('Asia/Baghdad'));
    if($modify) {
        $now->modify($modify);
    }
    if(!isset($type) || $type == 'datetime') {
        return $now->format('Y-m-d H:i:s');
    }
    if($type == 'time') {
        return $now->format('H:i:s');
    }
    if($type == 'timestamp') {
        return $now->getTimestamp();
    }
}
function timestampfromdate($date) {
    return DateTime::createFromFormat('Y-m-d H:i:s', $date, new DateTimeZone('Asia/Baghdad'))->getTimestamp();
}

echo getthistime('timestamp')."--".
    timestampfromdate(getthistime('datetime'))."--".
    strtotime(getthistime('datetime'));

//getthistime('timestamp') == timestampfromdate(getthistime('datetime')) (true)
//getthistime('timestamp') == strtotime(getthistime('datetime')) (false)

-4

Se stai cercando di convertire un datetime UTC ( 2016-02-14T12:24:48.321Z) in timestamp, ecco come lo faresti:

function UTCToTimestamp($utc_datetime_str)
{
    preg_match_all('/(.+?)T(.+?)\.(.*?)Z/i', $utc_datetime_str, $matches_arr);
    $datetime_str = $matches_arr[1][0]." ".$matches_arr[2][0];

    return strtotime($datetime_str);
}

$my_utc_datetime_str = '2016-02-14T12:24:48.321Z';
$my_timestamp_str = UTCToTimestamp($my_utc_datetime_str);
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.