time()
เป็นวินาที - มีหนึ่งมิลลิวินาทีหรือไม่
time()
เป็นวินาที - มีหนึ่งมิลลิวินาทีหรือไม่
คำตอบ:
คำตอบสั้น ๆคือ:
$milliseconds = round(microtime(true) * 1000);
microtime(true) / 1000
(แบ่งแทนการ mulitplication)?
microtime
ใช้ ฟังก์ชันนี้คืนค่าสตริงคั่นด้วยช่องว่าง ส่วนแรกคือส่วนเศษส่วนของวินาทีส่วนที่สองคือส่วนที่สำคัญ ส่งผ่านtrue
เพื่อรับเป็นหมายเลข:
var_dump(microtime()); // string(21) "0.89115400 1283846202"
var_dump(microtime(true)); // float(1283846202.89)
microtime(true)
ระวังของการสูญเสียความแม่นยำถ้าคุณใช้
นอกจากนี้ยังมีgettimeofday
ที่คืน microseconds ส่วนหนึ่งเป็นจำนวนเต็ม
var_dump(gettimeofday());
/*
array(4) {
["sec"]=>
int(1283846202)
["usec"]=>
int(891199)
["minuteswest"]=>
int(-60)
["dsttime"]=>
int(1)
}
*/
microtime()
เท่ากับพูด1000*time()
ใช่มั้ย
1000
ใช่ไหม
microtime(true)
และ1000*time()
1000*time()
จะไม่ให้มิลลิวินาที microtime(true)
ส่งคืน a float
ซึ่งมีความแม่นยำ 14 หลัก ส่วนวินาทีใช้เวลาไปแล้ว 10 ดังนั้นจึงเหลือ 4 หลักสำหรับส่วนไมโครวินาที ควรจะเพียงพอเนื่องจากมิลลิวินาทีต้องการเพียง 3 หลักเท่านั้น
แพลตฟอร์ม 64 บิตเท่านั้น!
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
[ หากคุณใช้ PHP 64 บิตดังนั้นค่าคงที่PHP_INT_SIZE
เท่ากับ8
]
หากคุณต้องการฟังก์ชันที่สมดุลของหน่วยเป็นtime()
มิลลิวินาทีก่อนอื่นคุณต้องพิจารณาว่าเมื่อtime()
ส่งคืนจำนวนวินาทีที่ผ่านไปตั้งแต่ "เวลายุค" (01/01/1970) จำนวนมิลลิวินาทีนับตั้งแต่ "เวลายุค" เป็นจำนวนมาก และไม่พอดีกับจำนวนเต็ม 32 บิต
ขนาดของจำนวนเต็มใน PHP สามารถเป็น 32 หรือ 64 บิตขึ้นอยู่กับแพลตฟอร์ม
จากhttp://php.net/manual/th/language.types.integer.php
ขนาดของจำนวนเต็มขึ้นอยู่กับแพลตฟอร์มแม้ว่าค่าสูงสุดประมาณสองพันล้านเป็นค่าปกติ (นั่นคือการลงนาม 32 บิต) โดยทั่วไปแพลตฟอร์ม 64 บิตจะมีค่าสูงสุดประมาณ 9E18 ยกเว้นสำหรับ Windows ซึ่งเป็น 32 บิตเสมอ PHP ไม่รองรับจำนวนเต็มที่ไม่ได้ลงนาม ขนาดของจำนวนเต็มสามารถกำหนดโดยใช้ค่าคงที่ PHP_INT_SIZE และค่าสูงสุดโดยใช้ค่าคงที่ PHP_INT_MAX ตั้งแต่ PHP 4.4.0 และ PHP 5.0.5
หากคุณมีจำนวนเต็ม 64 บิตคุณอาจใช้ฟังก์ชันต่อไปนี้:
function milliseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}
microtime()
ส่งกลับจำนวนวินาทีตั้งแต่ "เวลายุค" ที่มีความแม่นยำสูงถึงไมโครวินาทีโดยมีตัวเลขสองตัวคั่นด้วยช่องว่างเช่น ...
0.90441300 1409263371
ตัวเลขที่สองคือจำนวนวินาที (จำนวนเต็ม) ในขณะที่ตัวเลขตัวแรกคือส่วนทศนิยม
ฟังก์ชั่นดังกล่าวmilliseconds()
ใช้เวลาส่วนจำนวนเต็มคูณด้วย1000
1409263371000
จากนั้นเพิ่มส่วนทศนิยมที่คูณด้วย1000
และปัดเศษเป็น 0 ทศนิยม
1409263371904
โปรดทราบว่าทั้งสอง$mt[1]
และผลมาจากการที่มีการออกเสียงลงไปround
int
นี้เป็นสิ่งจำเป็นเพราะพวกเขามีและการดำเนินการกับพวกเขาโดยไม่ต้องหล่อจะส่งผลในการทำงานกลับfloat
float
ในที่สุดฟังก์ชั่นนั้นก็แม่นยำกว่าเล็กน้อย
round(microtime(true)*1000);
ที่มีอัตราส่วน 1:10 (ประมาณ) จะส่งกลับ 1 มิลลิวินาทีมากกว่าผลลัพธ์ที่ถูกต้อง นี่คือเนื่องจากความแม่นยำที่ จำกัด ของประเภทลอย ( microtime(true)
ส่งกลับลอย) อย่างไรก็ตามถ้าคุณยังคงต้องการสั้นround(microtime(true)*1000);
ฉันขอแนะนำให้ส่งไปยังint
ผลที่ตามมา
แม้ว่ามันจะเกินขอบเขตของคำถาม แต่ก็คุ้มค่าที่จะกล่าวถึงว่าหากแพลตฟอร์มของคุณรองรับจำนวนเต็ม 64 บิตคุณสามารถรับเวลาปัจจุบันเป็นไมโครวินาทีโดยไม่เกิดการล้น
หากความเป็นจริง2^63 - 1
(ที่ใหญ่ที่สุดลงนามจำนวนเต็ม) หารด้วย10^6 * 3600 * 24 * 365
(โดยประมาณ microseconds ในหนึ่งปี) 292471
จะช่วยให้
นั่นคือค่าเดียวกันกับที่คุณได้รับ
echo (int)( PHP_INT_MAX / ( 1000000 * 3600 * 24 * 365 ) );
กล่าวอีกนัยหนึ่งจำนวนเต็ม 64 บิตที่เซ็นชื่อมีพื้นที่สำหรับเก็บช่วงเวลานานกว่า 200,000 ปีที่วัดเป็นไมโครวินาที
คุณอาจมีแล้ว
function microseconds() {
$mt = explode(' ', microtime());
return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000));
}
ดังที่คนอื่น ๆ ได้กล่าวไว้คุณสามารถใช้microtime()
เพื่อให้ได้ความแม่นยำเป็นมิลลิวินาทีในการประทับเวลา
จากความคิดเห็นของคุณดูเหมือนว่าคุณต้องการให้มันเป็น UNIX Timestamp ที่มีความแม่นยำสูง บางสิ่งบางอย่างDateTime.Now.Ticks
ในโลก. NET
คุณสามารถใช้ฟังก์ชั่นต่อไปนี้เพื่อทำ:
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);
}
ใช้microtime(true)
ใน PHP 5 หรือการปรับเปลี่ยนต่อไปนี้ใน PHP 4:
array_sum(explode(' ', microtime()));
วิธีพกพาในการเขียนโค้ดนั้นคือ:
function getMicrotime()
{
if (version_compare(PHP_VERSION, '5.0.0', '<'))
{
return array_sum(explode(' ', microtime()));
}
return microtime(true);
}
echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];
เอาท์พุท:
2016-11-19 15:12:34.346351
$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']);
ลองนี้:
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");
}
สิ่งนี้ใช้ได้แม้ว่าคุณจะใช้ PHP แบบ 32 บิต:
list($msec, $sec) = explode(' ', microtime());
$time_milli = $sec.substr($msec, 2, 3); // '1491536422147'
$time_micro = $sec.substr($msec, 2, 6); // '1491536422147300'
โปรดทราบว่านี่ไม่ได้ให้จำนวนเต็ม แต่เป็นสตริง อย่างไรก็ตามวิธีนี้ใช้ได้ดีในหลายกรณีเช่นเมื่อสร้าง URL สำหรับคำขอ REST
ถ้าคุณต้องการจำนวนเต็ม PHP แบบ 64 บิตเป็นสิ่งจำเป็น
จากนั้นคุณสามารถนำโค้ดด้านบนมาใช้ซ้ำและส่งไปที่ (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
หรือคุณสามารถใช้หนึ่งสมุทรที่ดี:
$time_milli = (int) round(microtime(true) * 1000); // 1491536422147
$time_micro = (int) round(microtime(true) * 1000000); // 1491536422147300
$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;
หมายเหตุ: PHP5 เป็นสิ่งจำเป็นสำหรับฟังก์ชั่นนี้เนื่องจากการปรับปรุงด้วย microtime () และจำเป็นต้องใช้โมดูลคณิตศาสตร์ bc ด้วย (เนื่องจากเรากำลังติดต่อกับคนจำนวนมากคุณสามารถตรวจสอบว่าคุณมีโมดูลเป็น phpinfo) หรือไม่
หวังว่านี่จะช่วยคุณได้
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
($the_date_time->format('u') / 1000);
PHP 5.2.2 <
$d = new DateTime();
echo $d->format("Y-m-d H:i:s.u"); // u : Microseconds
PHP 7.0.0 <7.1
$d = new DateTime();
echo $d->format("Y-m-d H:i:s.v"); // v : Milliseconds
ใช้สิ่งนี้:
function get_millis(){
list($usec, $sec) = explode(' ', microtime());
return (int) ((int) $sec * 1000 + ((float) $usec * 1000));
}
บาย
time()
ผมคิดว่าคุณมีความสับสนกับmicrotime(true)
ในทางกลับกันเวลาปัจจุบันในไม่กี่วินาทีนับตั้งแต่ยุค Unix แม่นยำถึงไมโครวินาทีที่ใกล้ที่สุด (ดูการอ้างอิง PHP) จริงๆแล้วมันง่ายมากที่จะทดสอบว่าคุณเรียกใช้โค้ดข้างต้นในการวนซ้ำและแสดงมิลลิวินาที