time()
jest w sekundach - czy jest w milisekundach?
php
time
milliseconds
Przybysz
źródło
źródło
time()
.microtime(true)
z drugiej strony zwraca bieżący czas w sekundach od epoki Uniksa z dokładnością do najbliższej mikrosekundy (patrz odnośnik do PHP). W rzeczywistości bardzo łatwo jest przetestować, jeśli uruchomisz powyższy kod w pętli i wyświetlisz milisekundy.microtime(true) / 1000
(podział zamiast mulitplication)?Zastosowanie
microtime
. Ta funkcja zwraca ciąg oddzielony spacją. Pierwsza część to ułamkowa część sekund, druga część to część integralna. Przekaż,true
aby uzyskać jako liczbę:Jeśli używasz, uważaj na utratę precyzji
microtime(true)
.Istnieje również,
gettimeofday
że zwraca część mikrosekund jako liczbę całkowitą.źródło
microtime()
jest równy1000*time()
, prawda?1000
, prawda?microtime(true)
oraz1000*time()
1000*time()
nie da milisekund.microtime(true)
zwraca a,float
który ma 14 cyfr precyzji. Część sekund zajęła już 10, więc pozostały 4 cyfry na część mikrosekund. To powinno wystarczyć, ponieważ milisekundy wymagają tylko 3 dodatkowych cyfr.Krótka odpowiedź:
Tylko platformy 64-bitowe!
[ Jeśli używasz 64-bitowego PHP, to stała
PHP_INT_SIZE
jest równa8
]Długa odpowiedź:
Jeśli chcesz najpierw uzyskać równoważną funkcję
time()
w milisekundach, musisz wziąć pod uwagę, że ponieważtime()
zwraca liczbę sekund, które upłynęły od „czasu epoki” (01/01/1970), liczba milisekund od „czasu epoki” jest dużą liczbą i nie pasuje do 32-bitowej liczby całkowitej.Rozmiar liczby całkowitej w PHP może wynosić 32 lub 64 bity w zależności od platformy.
Od http://php.net/manual/en/language.types.integer.php
Jeśli masz 64-bitowe liczby całkowite, możesz użyć następującej funkcji:
microtime()
zwraca liczbę sekund od „czasu epoki” z dokładnością do mikrosekund z dwiema liczbami oddzielonymi spacją, na przykład ...Druga liczba to sekundy (liczba całkowita), a pierwsza to część dziesiętna.
Powyższa funkcja
milliseconds()
przyjmuje część całkowitą pomnożoną przez1000
następnie dodaje część dziesiętną pomnożoną przez
1000
i zaokrągloną do 0 miejsc po przecinkuPamiętaj, że zarówno
$mt[1]
i wynikround
są rzutowane naint
. Jest to konieczne, ponieważ są onefloat
s, a operacja na nich bez rzutowania spowoduje, że funkcja zwróci afloat
.Wreszcie funkcja ta jest nieco bardziej precyzyjna niż
że przy stosunku 1:10 (w przybliżeniu) zwraca 1 milisekundę więcej niż prawidłowy wynik. Wynika to z ograniczonej precyzji typu float (
microtime(true)
zwraca float). W każdym razie, jeśli nadal wolisz krótszyround(microtime(true)*1000);
, sugeruję rzutowanieint
na wynik.Nawet jeśli wykracza to poza zakres pytania, warto wspomnieć, że jeśli twoja platforma obsługuje liczby całkowite 64-bitowe, możesz również uzyskać bieżący czas w mikrosekundach bez powodowania przepełnienia.
Jeśli fakt
2^63 - 1
(największa liczba całkowita ze znakiem) podzielony przez10^6 * 3600 * 24 * 365
(około mikrosekund w ciągu jednego roku) daje292471
.To ta sama wartość, którą otrzymujesz
Innymi słowy, 64-bitowa liczba całkowita ze znakiem ma miejsce na przechowywanie ponad 200 000 lat w mikrosekundach.
Możesz mieć wtedy
źródło
Jak inni stwierdzili, możesz użyć,
microtime()
aby uzyskać milisekundową precyzję na znacznikach czasu.Z twoich komentarzy wydaje się, że chcesz, aby był to precyzyjny znacznik czasu UNIX. Coś jak
DateTime.Now.Ticks
w świecie .NET.Aby to zrobić, możesz użyć następującej funkcji:
źródło
Użyj
microtime(true)
w PHP 5 lub następującą modyfikację w PHP 4:Przenośnym sposobem na napisanie tego kodu byłoby:
źródło
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
wynik:
2016-11-19 15:12:34.346351
źródło
$t = gettimeofday(); echo date('Y-m-d H:i:s.',$t['sec']) . $t['usec'];
$timeofday=gettimeofday(); echo sprintf("%s.%06d", date('Y-m-d H:i:s', $timeofday['sec']), $timeofday['usec']);
Spróbuj tego:
źródło
Działa to nawet jeśli korzystasz z 32-bitowego PHP:
Zauważ, że nie daje to liczb całkowitych, ale ciągi znaków. Jednak działa to dobrze w wielu przypadkach, na przykład podczas budowania adresów URL dla żądań REST.
Jeśli potrzebujesz liczb całkowitych, 64-bitowy PHP jest obowiązkowy.
Następnie możesz ponownie użyć powyższego kodu i przesłać do (int):
Lub możesz użyć dobrych, jednowarstwowych:
źródło
Mam nadzieję, że ci to pomoże.
źródło
źródło
PHP 5.2.2 <
PHP 7.0.0 <7.1
źródło
Użyj tego:
PA
źródło