วิธีรับการประทับเวลาปัจจุบันในหน่วยมิลลิวินาทีตั้งแต่ปี 1970 ตามที่ Java ได้รับ


135

ใน Java เราสามารถใช้System.currentTimeMillis()เพื่อรับการประทับเวลาปัจจุบันในหน่วยมิลลิวินาทีนับตั้งแต่เวลาซึ่งก็คือ -

ความแตกต่างวัดเป็นมิลลิวินาทีระหว่างเวลาปัจจุบันถึงเที่ยงคืนวันที่ 1 มกราคม 1970 UTC

ใน C ++ จะได้สิ่งเดียวกันได้อย่างไร?

ตอนนี้ฉันกำลังใช้สิ่งนี้เพื่อรับการประทับเวลาปัจจุบัน -

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; //get current timestamp in milliseconds

cout << ms << endl;

หน้าตาแบบนี้ใช่หรือไม่?

คำตอบ:


240

หากคุณสามารถเข้าถึงไลบรารี C ++ 11 ได้ให้ตรวจสอบstd::chronoไลบรารี คุณสามารถใช้มันเพื่อรับมิลลิวินาทีตั้งแต่ Unix Epoch ดังนี้:

#include <chrono>

// ...

using namespace std::chrono;
milliseconds ms = duration_cast< milliseconds >(
    system_clock::now().time_since_epoch()
);

92
ดี เพิ่ม count () ที่ท้ายบรรทัดเพื่อรับจำนวนมิลลิวินาทีในรูปแบบประเภทพื้นฐาน
P1r4nh4

1
@ ซับ: ทั้งสองยุคมีแนวโน้มที่จะเหมือนกัน แต่ค่าของมันอาจแตกต่างกัน steady_clockจะก้าวหน้าไปข้างหน้าเสมอมันเป็นตัวชี้วัดที่แท้จริงของเวลาตั้งแต่ยุคนั้นในขณะที่system_clockอาจเป็นตัวแทนของเวลาเชิงตรรกะตั้งแต่ยุค ในทุกๆวินาทีอธิกสุรทินทั้งสองสามารถเติบโตได้ไกลขึ้นโดยขึ้นอยู่กับการใช้งานระบบ
ออนซ์

4
เท่าที่ฉันรู้ยุคของนาฬิกาแต่ละเรือนขึ้นอยู่กับการใช้งาน Convention มีไว้system_clockเพื่อให้เหมือนกับ UNIX epoch แต่ข้อมูลจำเพาะบอกว่าต้องเป็นนาฬิกาแขวนแบบเรียลไทม์ทั้งระบบ ไม่มีข้อกำหนดที่steady_clockจะต้องตรงกับความเป็นจริงเพียง แต่ให้ก้าวไปข้างหน้าเท่านั้น
ออนซ์

1
@ Jason นอกจาก gettimeofday ไม่พร้อมใช้งานบน Windows แล้วไลบรารี chrono ยังสามารถให้ความละเอียดที่สูงขึ้น (gtod จำกัด อยู่ที่ไมโครวินาที) จัดเตรียมหน่วยเวลาด้วยวิธีที่ปลอดภัยเพื่อให้คอมไพเลอร์สามารถบังคับใช้การแปลงหน่วยและทำงานร่วมกับตัวดำเนินการทางคณิตศาสตร์ปกติ ( การเพิ่มtimevalโครงสร้างเป็นสิ่งที่น่ารำคาญ)
ออนซ์

3
นักพัฒนา Javascript กำลังหัวเราะเยาะฉันเมื่อเห็นสิ่งนี้ :(
จินตนาการ

42

ใช้ <sys/time.h>

struct timeval tp;
gettimeofday(&tp, NULL);
long int ms = tp.tv_sec * 1000 + tp.tv_usec / 1000;

อ้างนี้


ทางออกที่ดีฉันคิดว่ามันควรจะ gettimeofday (& tp, NULL);
Adem

4
ก่อนอื่นนี่คือ C ไม่ใช่ C ++ ประการที่สองมีปัญหากับ gettimeofday ดูนี้ตัวอย่างเช่น
rustyx

18

คำตอบนี้ค่อนข้างคล้ายกับOzโดยใช้<chrono>สำหรับ C ++ - ฉันไม่ได้คว้ามาจาก Oz แต่ ...

ฉันหยิบตัวอย่างข้อมูลต้นฉบับที่ด้านล่างของหน้านี้และแก้ไขเล็กน้อยเพื่อให้เป็นแอปคอนโซลที่สมบูรณ์ ฉันชอบใช้สิ่งนี้ของ lil 'ol' มันยอดเยี่ยมมากถ้าคุณเขียนสคริปต์จำนวนมากและต้องการเครื่องมือที่เชื่อถือได้ใน Windows เพื่อให้ได้ยุคสมัยในเสี้ยววินาทีจริงโดยไม่ต้องใช้ VB หรือโค้ดที่ทันสมัยน้อยกว่าและเป็นมิตรกับผู้อ่านน้อยกว่า

#include <chrono>
#include <iostream>

int main() {
    unsigned __int64 now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
    std::cout << now << std::endl;
    return 0;
}

ฉันได้จำนวนลบ-560549313นี่ไม่ถูกต้องใช่ไหม?
Noitidart

1
@Noitidart ช่วยบอกหน่อยได้ไหมว่าคุณใช้แพลตฟอร์มอะไรและคอมไพเลอร์ C ++? ฉันใช้สิ่งนี้ตลอดเวลากับเครื่องมืออัตโนมัติและไม่เคยเห็นผลลัพธ์ที่เป็นลบ o.0 ยินดีที่จะตรวจสอบมันมากกว่านี้ นอกจากนี้ยังเป็นสำเนาโดยตรงหรือโปรแกรมแก้ไข / รวม? เพียงแค่ต้องการให้แน่ใจว่ามีต้นกำเนิดจากรหัสนี้เท่านั้น
kayleeFrye_onDeck

5
อ่า @kayleeFrye_onDeck เพราะฉันใช้int! int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();. ฉันเปลี่ยนไปint64_tและมันได้ผล! ขอบคุณมากที่ขอข้อมูลเพิ่มเติมเพื่อช่วย
Noitidart

unsigned long longพกพาสะดวกกว่าและ__int64ใช้ได้เฉพาะบน MSVC เท่านั้น
SS Anne

ไม่มี__int64ประเภทใดใน C ++ มาตรฐาน หนึ่งสามารถใช้std::int64_tแทน
jaskmar

15

ตั้งแต่ C ++ 11 คุณสามารถใช้std::chrono:

  • รับเวลาของระบบปัจจุบัน: std::chrono::system_clock::now()
  • ได้รับเวลาตั้งแต่ยุค: .time_since_epoch()
  • แปลหน่วยพื้นฐานเป็นมิลลิวินาที: duration_cast<milliseconds>(d)
  • แปลstd::chrono::millisecondsเป็นจำนวนเต็ม ( uint64_tเพื่อหลีกเลี่ยงการล้น)
#include <chrono>
#include <cstdint>
#include <iostream>

uint64_t timeSinceEpochMillisec() {
  using namespace std::chrono;
  return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
}

int main() {
  std::cout << timeSinceEpochMillisec() << std::endl;
  return 0;
}

ฉันขอแนะนำให้ใช้unsigned long longแทนuint64_t.
csg

ทำไมunsigned long longแทนที่จะเป็นuint64_t? ฉันมีความชอบโดยธรรมชาติสำหรับประเภทที่สั้นกว่าที่จะพิมพ์
Jawad

13

หากใช้ gettimeofday คุณต้องร่ายยาวมิฉะนั้นคุณจะได้รับล้นและไม่ใช่จำนวนมิลลิวินาทีที่แท้จริงตั้งแต่ยุค: long int msint = tp.tv_sec * 1000 + tp.tv_usec / 1000; จะให้ตัวเลขเช่น 767990892 ซึ่งเป็นรอบ 8 วันหลังจากยุค ;-)

int main(int argc, char* argv[])
{
    struct timeval tp;
    gettimeofday(&tp, NULL);
    long long mslong = (long long) tp.tv_sec * 1000L + tp.tv_usec / 1000; //get current timestamp in milliseconds
    std::cout << mslong << std::endl;
}

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