วิธีรับเวลาปัจจุบันเป็นมิลลิวินาทีใน PHP


คำตอบ:


506

คำตอบสั้น ๆคือ:

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

26
@FredrikWendt time()ผมคิดว่าคุณมีความสับสนกับ microtime(true)ในทางกลับกันเวลาปัจจุบันในไม่กี่วินาทีนับตั้งแต่ยุค Unix แม่นยำถึงไมโครวินาทีที่ใกล้ที่สุด (ดูการอ้างอิง PHP) จริงๆแล้วมันง่ายมากที่จะทดสอบว่าคุณเรียกใช้โค้ดข้างต้นในการวนซ้ำและแสดงมิลลิวินาที
เรนท์

6
ฉันทำอย่างแน่นอน! :-)
Fredrik Wendt

10
ฉันชอบคำตอบสั้น ๆ
Erick Robertson

9
ไม่ควรที่จะmicrotime(true) / 1000(แบ่งแทนการ mulitplication)?
Jordan Lev

18
@JordanLev มันควรจะเป็นแบบทวีคูณเพราะ microtime (จริง) คืนค่า Unix timestamp เป็นวินาที
เรน

88

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()ใช่มั้ย
COMER

ฉันเห็นว่าอาจมีข้อผิดพลาด แต่ข้อผิดพลาดควรน้อยกว่า1000ใช่ไหม
COMER

@COMer: ตัวแปรที่คุณพูดถึงคืออะไร?
kennytm

microtime(true)และ1000*time()
Comer

@COMer: คุณ1000*time()จะไม่ให้มิลลิวินาที microtime(true)ส่งคืน a floatซึ่งมีความแม่นยำ 14 หลัก ส่วนวินาทีใช้เวลาไปแล้ว 10 ดังนั้นจึงเหลือ 4 หลักสำหรับส่วนไมโครวินาที ควรจะเพียงพอเนื่องจากมิลลิวินาทีต้องการเพียง 3 หลักเท่านั้น
kennytm

46

คำตอบสั้น ๆ :

แพลตฟอร์ม 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นี้เป็นสิ่งจำเป็นเพราะพวกเขามีและการดำเนินการกับพวกเขาโดยไม่ต้องหล่อจะส่งผลในการทำงานกลับfloatfloat

ในที่สุดฟังก์ชั่นนั้นก็แม่นยำกว่าเล็กน้อย

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

ทำไมไม่เพียง: `ฟังก์ชัน getMilliEpoch () {$ mt = ระเบิด ('', microtime ()); ส่งคืน $ mt [1] substr ($ mt [0], 0, 5) * 1,000; } `
ไมเคิล

ขณะนี้มีพารามิเตอร์สำหรับฟังก์ชั่น microtime หากตั้งค่าเป็นจริงมันจะส่งคืนวินาทีและมิลลิวินาทีนับตั้งแต่วันที่ 1 มกราคมในปี 1970, 0 ชั่วโมง 0 นาที 0 วินาทีเป็นทุ่น นี่คือตัวอย่าง: microtime (จริง) // 1553260455.7242
kukko

@ kukko ใช่ แต่เนื่องจากความแม่นยำ จำกัดของประเภทลอยการคำนวณจำนวนมิลลิวินาทีจาก microtime (จริง) จะส่งผลให้ค่าที่ไม่ถูกต้องเล็กน้อย
เปาโล

42

ดังที่คนอื่น ๆ ได้กล่าวไว้คุณสามารถใช้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);
}

นั่นคือวิธีที่จะทำ!
tonix

1
perrrrrrfect .. ♥
SRB ห้าม

ไม่ส่งคืนเวลาเซิร์ฟเวอร์หรือไม่ ในกรณีของฉันฉันเห็นเวลาที่เก็บไว้ใน db เป็นเวลาเบราว์เซอร์ท้องถิ่นของฉัน สมมติว่าเขตเวลาตัดของฉันคือ EST + 3 และเวลาเบราว์เซอร์ของฉันคือ GMT + 6 ขณะที่ฉันส่งแบบฟอร์มจากที่ตั้ง GMT + 6 ฉันเห็นเวลาที่เก็บไว้คือ GMT + 6 เวลาเทียบเท่ากับมิลลิวินาที ดังนั้นปัญหาคืออะไร :(
สุดยอด

12

ใช้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);
}

11

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

เอาท์พุท:

2016-11-19 15:12:34.346351


1
ใช้การประทับเวลาเดียวกัน:$t = gettimeofday(); echo date('Y-m-d H:i:s.',$t['sec']) . $t['usec'];
Savvas Radevic

microseconds ควรเป็นศูนย์โดยไม่มีการเติม:$timeofday=gettimeofday(); echo sprintf("%s.%06d", date('Y-m-d H:i:s', $timeofday['sec']), $timeofday['usec']);
mabi

7

ลองนี้:

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

6

สิ่งนี้ใช้ได้แม้ว่าคุณจะใช้ 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

5
$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;

หมายเหตุ: PHP5 เป็นสิ่งจำเป็นสำหรับฟังก์ชั่นนี้เนื่องจากการปรับปรุงด้วย microtime () และจำเป็นต้องใช้โมดูลคณิตศาสตร์ bc ด้วย (เนื่องจากเรากำลังติดต่อกับคนจำนวนมากคุณสามารถตรวจสอบว่าคุณมีโมดูลเป็น phpinfo) หรือไม่

หวังว่านี่จะช่วยคุณได้


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

นั่นคือชอบเติมเต็มสามศูนย์ไปทางขวาหรือไม่?
Zeeshan

ไม่ใช่เลย. มันแปลงทั้งสองส่วนเป็นมิลลิวินาทีและให้ผลรวม ดังนั้นจึงมีความแม่นยำมากกว่าการเพิ่มศูนย์
3767296

1
ในขณะที่ข้อมูลโค้ดนี้อาจแก้ไขคำถามรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ โปรดอย่าพยายามทำให้รหัสของคุณแน่นเกินไปด้วยคำอธิบายที่อธิบายซึ่งจะช่วยลดความสามารถในการอ่านของทั้งรหัสและคำอธิบาย!
MichałPerłakowski

1

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 

1
ใน PHP <7.1 DateTime ใหม่ () microseconds อยู่เสมอ 0 ดูphp.net/manual/en/migration71.incompatible.php
Mabi

-2

ใช้สิ่งนี้:

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

บาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.