Risposte:
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.
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);
date_parse_from_format
invece di strptime
.
strptime
non è implementato su piattaforme Windows.
Con DateTime
API :
$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' IntlDateFormatter
API:
$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.
!
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.
Fai attenzione a funzioni come strtotime()
quelle, cerca di "indovinare" ciò che intendi (non indovina, le regole sono qui ).
Effettivamente 22-09-2008
verrà analizzato il 22 settembre 2008 , in quanto è l'unica cosa ragionevole.
Come verrà 08-09-2008
analizzato? 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-YYYY
formato, è meglio usare la soluzione offerta da @Armin Ronacher .
dd-mm-yyyy
no mm-dd-yyyy
.
YYYY-mm-dd
La conversione avviene solo per essere visualizzata agli utenti
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.
Utilizzando mktime :
list($day, $month, $year) = explode('-', '22-09-2008');
echo mktime(0, 0, 0, $month, $day, $year);
strtotime()
Per qualche motivo strtotime()
non funziona in determinate date ed è quindi molto inaffidabile.
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/
Ecco una soluzione molto semplice ed efficace che utilizza le funzioni split
e 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.
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']);
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-2008
potrebbe essere il 3 aprile o il 4 marzo a seconda di dove vieni :)
Se conosci il formato usa strptime
perché strtotime
fa un'ipotesi per il formato, che potrebbe non essere sempre corretto. Poiché strptime
non è 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)
<?php echo date('M j Y g:i A', strtotime('2013-11-15 13:01:02')); ?>
$time = '22-09-2008';
echo strtotime($time);
Usa la funzione PHP strtotime()
echo strtotime('2019/06/06');
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
<?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') ?>
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.
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 timestamp
utilizzostrtotime
. 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)
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);