time()
è in secondi: c'è uno in millisecondi?Come ottenere l'ora corrente in millisecondi in PHP?
risposta
Use microtime()
. Questa funzione restituisce una stringa separata da uno spazio. La prima parte è la parte frazionaria di secondi, la seconda parte è la parte integrale. Passano in true
di ottenere un numero:
var_dump(microtime()); // string(21) "0.89115400 1283846202"
var_dump(microtime(true)); // float(1283846202.89)
Beware of perdita di precisione, se si utilizza microtime(true)
.
There is also gettimeofday()
che restituisce la parte in microsecondi come numero intero.
var_dump(gettimeofday());
/*
array(4) {
["sec"]=>
int(1283846202)
["usec"]=>
int(891199)
["minuteswest"]=>
int(-60)
["dsttime"]=>
int(1)
}
*/
Come altri hanno già detto, è possibile utilizzare microtime()
per ottenere precisione micrometrica su timestamp.
Dai tuoi commenti, sembra che tu voglia come UNIX Timestamp ad alta precisione. Qualcosa come DateTime.Now.Ticks
nel mondo .NET.
È possibile utilizzare la seguente funzione per farlo:
function millitime() {
$microtime = microtime();
$comps = explode(' ', $microtime);
// Note: Using a string here to prevent loss of precision
// in case of "overflow" (PHP converts it to a double)
return sprintf('%d%03d', $comps[1], $comps[0] * 1000);
}
Esattamente ciò che è necessario. – shamittomar
Questo è il modo per farlo! – tonix
perrrrrrrfect .. ♥. –
Usa microtime(true)
in PHP 5, o la seguente modifica in PHP 4:
array_sum(explode(' ', microtime()));
Un modo portabile di scrivere che il codice avrebbe essere:
function getMicrotime()
{
if (version_compare(PHP_VERSION, '5.0.0', '<'))
{
return array_sum(explode(' ', microtime()));
}
return microtime(true);
}
La risposta breve è:
$milliseconds = round(microtime(true) * 1000);
@FredrikWendt, penso che tu stia confondendo con 'time()'. 'microtime (true)' d'altra parte restituisce l'ora corrente in secondi da quando l'epoca di Unix è accurata al microsecondo più vicino (vedi riferimento PHP). In realtà è molto facile da testare se si esegue il codice sopra in un ciclo e si visualizzano i millisecondi. –
Ho assolutamente fatto! :-) –
Mi piace la risposta breve. –
Utilizzare questa:
function get_millis(){ list($usec, $sec) = explode(' ', microtime()); return (int) ((int) $sec * 1000 + ((float) $usec * 1000)); }
Bye
Risposta breve: solo
64 piattaforme bit!
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
Risposta lunga:
Se si desidera una funzione equilvalent di time()
in millisecondi prima devi considerare che come time()
restituisce il numero di secondi trascorsi dal momento che il "tempo di un'epoca (01/01/1970), il numero di millisecondi poiché il "tempo storico" è un numero elevato e non si adatta a un intero a 32 bit.
La dimensione di un numero intero in PHP può essere 32 o 64 bit a seconda della piattaforma.
Da http://php.net/manual/en/language.types.integer.php
Le dimensioni di un intero dipende dalla piattaforma, anche se un valore massimo di circa due miliardi è il valore usuale (che è 32 bit firmati). Le piattaforme a 64 bit di solito hanno un valore massimo di circa 9E18, ad eccezione di Windows, che è sempre a 32 bit. PHP non supporta gli interi senza segno. La dimensione intera può essere determinata utilizzando la costante PHP_INT_SIZE e il valore massimo utilizzando la costante PHP_INT_MAX da PHP 4.4.0 e PHP 5.0.5.
Se avete 64 bit interi allora si può utilizzare la seguente funzione:
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
microtime()
restituisce il numero di secondi dal momento che il "tempo di epoca" con una precisione fino a microsecondi con due numeri separati da uno spazio , ad esempio ...
0.90441300 1409263371
Il secondo numero è i secondi (numero intero) preceduti dalla parte decimale.
La funzione milliseconds
prendere la parte intera moltiplicato per 1000
1409263371000
e aggiunge la parte decimale moltiplicato per 1000
e arrotondato a 0 decimali
1409263371904
noti che sia $mt[1]
e il risultato di round
sono castati a int
. Ciò è necessario perché sono float
s e l'operazione su di essi senza il cast comporterebbe la restituzione di una float
.
Infine, tale funzione è leggermente più preciso rispetto
round(microtime(true)*1000);
che con un rapporto di 1:10 (circa.) Restituisce 1 millisecondo più che il risultato corretto. Ciò è dovuto alla precisione limitata del tipo float (microtime(true)
restituisce un float). Ad ogni modo se si preferisce ancora il round(microtime(true)*1000);
più corto suggerirei di trasmettere a int
il risultato.
Anche se è al di là della portata della questione vale la pena ricordare che, se la vostra piattaforma supporta 64 bit interi allora si può anche ottenere il tempo corrente in microsecondi senza incorrere nel troppo pieno.
Se il fatto 2^63
(circa il numero intero con segno più grande) diviso per 10^6 * 3600 * 24 * 365
(circa i microsecondi in un anno) restituisce ca. 292471
.
Questo è lo stesso valore restituito da echo PHP_INT_MAX/(1000000*3600*24*365);
In altre parole un intero con segno hanno spazio per memorizzare un periodo di oltre 200 mila anni misurato in microsecondi.
Potrebbe essere quindi
function microseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000));
}
perché non solo: ' function getMilliEpoch() { $ mt = explode ('', microtime()); ritorno $ mt [1]. substr ($ mt [0], 0, 5) * 1000; } ' – Michael
$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;
NOTA: PHP5 è necessario per questa funzione a causa dei miglioramenti con microtime() e il modulo bc matematica è anche il termine (come siamo trattando con grandi numeri, puoi verificare se hai il modulo in phpinfo).
Spero che questo ti aiuti.
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
($the_date_time->format('u')/1000);
E 'davvero come riempire tre zeri a destra? – Zeeshan
Niente affatto. Converte entrambe le parti in millisecondi e fornisce la somma. Quindi è più preciso di aggiungere zero. – user3767296
Sebbene questo snippet di codice possa risolvere la domanda, [includendo una spiegazione] (// meta.stackexchange.com/questions/114762/explaining-entally-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. Cerca anche di non affollare il tuo codice con commenti esplicativi, questo riduce la leggibilità sia del codice che delle spiegazioni! –
provare questo:
public function getTimeToMicroseconds() {
$t = microtime(true);
$micro = sprintf("%06d", ($t - floor($t)) * 1000000);
$d = new DateTime(date('Y-m-d H:i:s.' . $micro, $t));
return $d->format("Y-m-d H:i:s.u");
}
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
uscita:
2016-11-19 15:12:34.346351
Utilizza lo stesso timestamp: '$ t = gettimeofday(); data dell'eco ('Y-m-d H: i: s.', $ t ['sec']). $ T [ 'usec']; ' –
Questo funziona anche se si è a 32 bit PHP:
list($msec, $sec) = explode(' ', microtime());
$time_milli = $sec.substr($msec, 2, 3); // '1491536422147'
$time_micro = $sec.substr($msec, 2, 6); // '1491536422147300'
Nota questo non fornisce numeri interi, ma stringhe. Tuttavia questo funziona in molti casi, ad esempio quando si costruiscono URL per le richieste REST.
Se sono necessari numeri interi, PHP a 64 bit è obbligatorio.
Quindi è possibile riutilizzare il codice di cui sopra e cast (int):
list($msec, $sec) = explode(' ', microtime());
// these parentheses are mandatory otherwise the precedence is wrong!
// ↓ ↓
$time_milli = (int) ($sec.substr($msec, 2, 3)); // 1491536422147
$time_micro = (int) ($sec.substr($msec, 2, 6)); // 1491536422147300
Oppure si può utilizzare il buon vecchio' one-liner:
$time_milli = (int) round(microtime(true) * 1000); // 1491536422147
$time_micro = (int) round(microtime(true) * 1000000); // 1491536422147300
La fortuna conta su così anche – prograshid
Come è spesso il caso, penso che la maggior parte dei upvotes sarà ** perché ** lo ha chiesto - piuttosto che *** come *** ha chiesto. –