Sto cercando di ottenere una data formattata, inclusi i microsecondi da millisecondi.
L'unico problema è che continuo a ricevere 000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
ex. 28-07-2013 11: 26: 14.000000
Sto cercando di ottenere una data formattata, inclusi i microsecondi da millisecondi.
L'unico problema è che continuo a ricevere 000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
ex. 28-07-2013 11: 26: 14.000000
Risposte:
php.net dice:
Microsecondi (aggiunti in PHP 5.2.2). Nota che
date()genererà sempre000000poiché richiede un parametro intero, mentreDateTime::format()supporta i microsecondi se èDateTimestato creato con microsecondi.
Quindi usa il più semplice:
$micro_date = microtime();
$date_array = explode(" ",$micro_date);
$date = date("Y-m-d H:i:s",$date_array[1]);
echo "Date: $date:" . $date_array[0]."<br>";
Consigliato e utilizzare la dateTime()classe da riferimento:
$t = microtime(true);
$micro = sprintf("%06d",($t - floor($t)) * 1000000);
$d = new DateTime( date('Y-m-d H:i:s.'.$micro, $t) );
print $d->format("Y-m-d H:i:s.u"); // note at point on "u"
La nota uè microsecondi (1 secondo = 1000000 µs).
Un altro esempio da php.net :
$d2=new DateTime("2012-07-08 11:14:15.889342");
Riferimento di dateTime()su php.net
Ho risposto alla domanda più breve e semplificata per l'autore. Per ulteriori informazioni, vedere l'autore: ottenere il formato della data mdY H: i: su da millisecondi
microtime(false)nessuno dei due.)
2012-07-08 11:14:15.0.889342
Puoi farlo facilmente con il formato di input U.u.
$now = DateTime::createFromFormat('U.u', microtime(true));
echo $now->format("m-d-Y H:i:s.u");
Questo produce il seguente output:
04-13-2015 05:56:22.082300
Dalla pagina di manuale PHP per i formati di data:
http://php.net/manual/en/function.date.php
Grazie a Giggsey per aver segnalato un difetto nella mia risposta originale, l'aggiunta number_format()alla riga dovrebbe risolvere il caso del secondo esatto. Peccato che non sia più così elegante ...
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
http://php.net/manual/en/function.number-format.php
Una nota sui fusi orari in risposta a DaVe.
Normalmente il createFromFormat() metodo utilizza il fuso orario locale se non è specificato.
http://php.net/manual/en/datetime.createfromformat.php
Tuttavia, la tecnica qui descritta consiste nell'inizializzare l'oggetto DateTime utilizzando microtime()che restituisce il numero di secondi trascorsi dall'Epoch di Unix (01 gennaio 1970 00:00:00 GMT).
http://php.net/manual/en/function.microtime.php
Ciò significa che l'oggetto DateTime viene inizializzato in modo implicito in UTC, il che va bene per le attività interne del server che vogliono solo tenere traccia del tempo trascorso.
Se è necessario visualizzare l'ora per un determinato fuso orario, è necessario impostarlo di conseguenza. Tuttavia, questo dovrebbe essere fatto come passaggio separato dopo l'inizializzazione ( senza utilizzare il terzo parametro di createFromFormat()) per i motivi discussi sopra.
Il setTimeZone() metodo può essere utilizzato per soddisfare questo requisito.
http://php.net/manual/en/datetime.settimezone.php
Come esempio:
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
echo $now->format("m-d-Y H:i:s.u") . '<br>';
$local = $now->setTimeZone(new DateTimeZone('Australia/Canberra'));
echo $local->format("m-d-Y H:i:s.u") . '<br>';
Produce il seguente output:
10-29-2015 00:40:09.433818
10-29-2015 11:40:09.433818
Nota che se vuoi inserire in mysql, il formato dell'ora deve essere:
format("Y-m-d H:i:s.u")
DateTime::createFromFormat('U.u', microtime(true));restituirà false se microtime(true)viene eseguito sul secondo esatto. Restituisce "1438616239" invece di "1438616239.000000".
number_formatè sempre necessario, anche quando non è al secondo esatto. Altrimenti sei in balia precisiondell'opzione di configurazione PHP (per "display"), che non è abbastanza alta di default a partire da PHP 7.0 causando una perdita di precisione (non accurata fino al microsecondo).
Ecco un approccio leggermente più breve. Anziché lavorare per creare una data / ora numerica ad alta precisione, converto il valore in microsecondi in una stringa, rimuovo il 0e lo aggiungo alla fine della stringa data / ora. Posso facilmente tagliare il numero di decimali regolando il parametro della lunghezza della stringa; qui io uso 4per ottenere millisecondi, ma potresti usare 7per ottenere microsecondi.
$t = explode(" ",microtime());
echo date("m-d-y H:i:s",$t[1]).substr((string)$t[0],1,4);
Per un valore microtime () di 0.98236000 1407400573, restituisce 08-07-14 01:08:13.982.
echo date('m-d-Y H:i:s').substr(fmod(microtime(true), 1), 1);
output di esempio:
02-06-2019 16:45:03.53811192512512
Se hai bisogno di limitare il numero di cifre decimali, la riga sottostante (credit mgutt) sarebbe una buona alternativa. (Con il codice seguente, il 6 limita il numero di cifre decimali a 6.)
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));
output di esempio:
02-11-2019 15:33:03.624493
echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));. Spiegazione perché abbiamo bisogno 09: stackoverflow.com/a/28739819/318765
echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
substr()non arrotonda. E in combinazione con round()esso taglierebbe gli zeri finali: stackoverflow.com/questions/7493305/… Questo è il motivo per cui ho proposto sprintf().
Se (new Date()).toISOString()per qualche motivo vuoi formattare una data come JavaScript , ecco come puoi farlo in PHP:
$now = microtime(true);
gmdate('Y-m-d\TH:i:s', $now).sprintf('.%03dZ',round(($now-floor($now))*1000));
Output di esempio:
2016-04-27T18:25:56.696Z
Solo per dimostrare che la sottrazione dell'intero numero non riduce la precisione della parte decimale:
>>> number_format(123.01234567890123456789,25)
=> "123.0123456789012408307826263"
>>> number_format(123.01234567890123456789-123,25)
=> "0.0123456789012408307826263"
PHP ha arrotondato le cifre decimali, ma le ha arrotondate allo stesso modo in entrambi i casi.
date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));?
$timeè già in millisecondi, sì, tecnicamente funzionerebbe. Non amare ilsubstr hack, ma immagino che funzionerebbe per le date tra il 2001 e il 2286.
$time è la SM, ma che dire 2286, perché la penso così e come sarebbe possibile sfuggire a tale?
Questo è basato sulla risposta di ArchCodeMonkey.
Ma semplificato, se vuoi solo qualcosa di veloce che funzioni.
function DateTime_us_utc(){
return DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
}
function DateTime_us(){
$now = DateTime_us_utc();
return $now->setTimeZone(new DateTimeZone(date_default_timezone_get()));
}
Quindi per me allora
$now = DateTime_us();
$now->format("m-d-Y H:i:s.u");
A partire da PHP 7.1 puoi semplicemente fare questo:
$date = new DateTime( "NOW" );
echo $date->format( "m-d-Y H:i:s.u" );
Verrà visualizzato come:
04-11-2018 10:54:01.321688
La documentazione dice quanto segue:
Microsecondi (aggiunti in PHP 5.2.2). Nota che date () genererà sempre 000000 poiché accetta un parametro intero, mentre DateTime :: format () supporta i microsecondi.
Cioè, usa DateTime invece.
new DateTime()restituirà anche 0000 per te. Ma se gli fornisci un tempo di precisione del microsecondo durante la creazione dell'istanza, funziona bene.
new DateTime( 'Y-m-d H:i:s.'.$micro);
Con PHP 7.0 e versioni successive ora qui puoi fare quanto segue:
$dateString = substr($millseconds_go_here,0,10);
$drawDate = new \DateTime(Date('Y-m-d H:i',$dateString));
$drawDate->setTimezone(new \DateTimeZone('UTC'));
Questo fa quanto segue in ordine:
Date() poter gestire la data.DateTime()può quindi consentirti di modificare il fuso orario in cui ti trovi, ma assicurati che date_default_timezone_set("Timezone");sia impostato prima dell'usoDateTime() funzioni e classi.DateTime()vengono utilizzate classi o funzioni.se stai usando Carbon, puoi usare la specifica definita "RFC3339_EXTENDED". o personalizzalo.
Carbon::RFC3339_EXTENDED = 'Y-m-d\TH:i:s.vP';
Basato sulla risposta di @ArchCodeMonkey.
Se lo declare(strict_types=1)hai, devi lanciare il secondo argomento su string
Ho messo in panchina diversi modi:
1) microtime + sscanf + data:
sscanf(microtime(), '0.%6s00 %s', $usec, $sec);
$date = date('Y-m-d H:i:s.', $sec) . $usec;
Non sono sicuro del motivo per cui microtime () restituisce 10 caratteri (0.dddddd00) per la parte dei microsecondi ma forse qualcuno può dirmelo?
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { sscanf(microtime(), '0.%6s00 %s', $usec, $sec); $date = date('Y-m-d H:i:s.', $sec) . $usec; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "22372.335910797 ms" // macOS PHP 5.6.30
string(18) "16772.964000702 ms" // Linux PHP 5.4.16
string(18) "10382.229089737 ms" // Linux PHP 7.3.11 (same linux box as above)
2) DateTime :: createFromFormat + Datetime-> format:
$now = new DateTime('NOW');
$date = $now->format('Y-m-d H:i:s.u');
non funziona in PHP 5.x ...
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = new DateTime('NOW'); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "45801.825046539 ms" // macOS PHP 5.6.30 (ms not working)
string(18) "21180.155038834 ms" // Linux PHP 5.4.16 (ms not working)
string(18) "11879.796028137 ms" // Linux PHP 7.3.11 (same linux box as above)
3) gettimeofday + date:
$time = gettimeofday();
$date = date('Y-m-d H:i:s.', $time['sec']) . $time['usec'];
-
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $time = gettimeofday(); $date = date('Y-m-d H:i:s.', $time['sec']) . $time['usec']; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "23706.788063049 ms" // macOS PHP 5.6.30
string(18) "14984.534025192 ms" // Linux PHP 5.4.16
string(18) "7799.1390228271 ms" // Linux PHP 7.3.11 (same linux box as above)
4) microtime + number_format + DateTime :: createFromFormat + DateTime-> format:
$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
$date = $now->format('Y-m-d H:i:s.u');
-
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', '')); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "83326.496124268 ms" // macOS PHP 5.6.30
string(18) "61982.603788376 ms" // Linux PHP 5.4.16
string(16) "19107.1870327 ms" // Linux PHP 7.3.11 (same linux box as above)
5) microtime + sprintf + DateTime :: createFromFormat + DateTime-> formato:
$now = DateTime::createFromFormat('U.u', sprintf('%.6f', microtime(true)));
$date = $now->format('Y-m-d H:i:s.u');
-
$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = DateTime::createFromFormat('U.u', sprintf('%.6f', microtime(true))); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "79387.331962585 ms" // macOS PHP 5.6.30
string(18) "60734.437942505 ms" // Linux PHP 5.4.16
string(18) "18594.941139221 ms" // Linux PHP 7.3.11 (same linux box as above)