2010-09-07 23 views

risposta

69

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) 
} 
*/ 
+0

Quindi, in generale, 'microtime()' è uguale a '1000 * time()', giusto? – COMer

+0

@COMer: non esattamente. Vedi l'aggiornamento. – kennytm

+0

Vedo, ci possono essere errori, ma l'errore dovrebbe essere inferiore a '1000', giusto? – COMer

34

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); 
} 
+1

Esattamente ciò che è necessario. – shamittomar

+0

Questo è il modo per farlo! – tonix

+0

perrrrrrrfect .. ♥. –

11

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); 
} 
342

La risposta breve è:

$milliseconds = round(microtime(true) * 1000); 
+22

@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. –

+5

Ho assolutamente fatto! :-) –

+8

Mi piace la risposta breve. –

-2

Utilizzare questa:

function get_millis(){ list($usec, $sec) = explode(' ', microtime()); return (int) ((int) $sec * 1000 + ((float) $usec * 1000)); }

Bye

26

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)); 
} 
+0

perché non solo: ' function getMilliEpoch() { $ mt = explode ('', microtime()); ritorno $ mt [1]. substr ($ mt [0], 0, 5) * 1000; } ' – Michael

4
$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.

2
$the_date_time = new DateTime($date_string); 
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) + 
    ($the_date_time->format('u')/1000); 
+0

E 'davvero come riempire tre zeri a destra? – Zeeshan

+0

Niente affatto. Converte entrambe le parti in millisecondi e fornisce la somma. Quindi è più preciso di aggiungere zero. – user3767296

+0

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! –

5

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"); 
} 
3

echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];

uscita:

2016-11-19 15:12:34.346351

+0

Utilizza lo stesso timestamp: '$ t = gettimeofday(); data dell'eco ('Y-m-d H: i: s.', $ t ['sec']). $ T [ 'usec']; ' –

1

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 
Problemi correlati