Bagaimana cara mendapatkan cap waktu saat ini dalam milidetik sejak tahun 1970 seperti cara Java


134

Di Jawa, kita bisa menggunakan System.currentTimeMillis() untuk mendapatkan cap waktu saat ini dalam Milidetik sejak zaman yang -

perbedaannya, diukur dalam milidetik, antara waktu saat ini dan tengah malam, 1 Januari 1970 UTC.

Di C ++ cara mendapatkan hal yang sama?

Saat ini saya menggunakan ini untuk mendapatkan cap waktu saat ini -

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;

Ini terlihat benar atau tidak?

Jawaban:


239

Jika Anda memiliki akses ke perpustakaan C ++ 11, periksa std::chronoperpustakaan. Anda dapat menggunakannya untuk mendapatkan milidetik sejak Unix Epoch seperti ini:

#include <chrono>

// ...

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

92
Bagus. Tambahkan jumlah () di akhir baris untuk mendapatkan jumlah milidetik dalam format tipe dasar.
P1r4nh4

1
@lining: Kedua zaman cenderung sama, tetapi nilainya bisa berbeda. steady_clockakan selalu maju, itu adalah ukuran sebenarnya dari waktu sejak zamannya sementara system_clockmungkin merupakan representasi dari waktu logis sejak zaman itu. Untuk setiap detik kabisat keduanya dapat tumbuh lebih jauh tergantung pada implementasi sistem.
Oz.

4
Sejauh yang saya tahu, zaman untuk masing-masing jam tergantung pada implementasi. Konvensi system_clockharus sama dengan zaman UNIX, tetapi spesifikasi hanya mengatakan itu harus jam dinding waktu nyata seluruh sistem. Tidak ada persyaratan untuk steady_clockmencocokkan kenyataan, hanya saja ia hanya bergerak maju.
Oz.

1
@Jason Selain gettimeofday tidak tersedia di Windows, perpustakaan chrono dapat memberikan Anda resolusi yang lebih tinggi (gtod terbatas pada mikrodetik), menyediakan unit waktu dengan cara yang aman sehingga kompiler dapat menegakkan konversi unit, dan bekerja dengan operator aritmatika normal ( menambahkan timevalstruct itu menjengkelkan).
Oz.

3
Pengembang Javascript menertawakan saya melihat ini :(
fantastory

42

menggunakan <sys/time.h>

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

lihat ini .


solusi yang baik, juga saya pikir itu harus menjadi hari libur (& tp, NULL);
Adem

4
Pertama-tama, ini adalah C, bukan C ++. Kedua, ada masalah dengan gettimeofday, lihat ini misalnya.
rustyx

17

Jawaban ini sangat mirip dengan Oz. , Gunakan <chrono>untuk C ++ - Saya tidak mengambilnya dari Oz. meskipun...

Saya mengambil cuplikan asli di bagian bawah halaman ini , dan sedikit memodifikasinya menjadi aplikasi konsol yang lengkap. Saya suka menggunakan lil 'ol' ini. Sangat luar biasa jika Anda melakukan banyak scripting dan membutuhkan alat yang andal di Windows untuk mendapatkan zaman dalam milidetik yang sebenarnya tanpa menggunakan VB, atau kode yang kurang modern, kurang ramah pembaca.

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

Saya mendapatkan angka negatif -560549313ini tidak benar, bukan?
Noitidart

1
@Noitidart Bisakah Anda memberi tahu saya platform apa dan kompiler C ++ yang Anda gunakan? Saya menggunakan hal ini sepanjang waktu dengan alat otomatisasi, dan belum pernah melihat output negatif o.0 Lebih dari senang untuk memeriksanya. Juga, apakah itu salinan langsung, atau program yang dimodifikasi / terintegrasi? Hanya ingin memastikan itu berasal dari kode ini saja.
kayleeFrye_onDeck

5
Ah @kayleeFrye_onDeck karena saya menggunakan int! int nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();. Saya menggoyangkannya int64_tdan berhasil! Terima kasih banyak telah meminta info lebih lanjut untuk membantu!
Noitidart

unsigned long longlebih portabel, dan __int64hanya tersedia di MSVC.
SS Anne

tidak ada __int64jenis standar C ++. Orang bisa menggunakan std::int64_tsebagai gantinya.
jaskmar

14

Karena C ++ 11 Anda dapat menggunakan std::chrono:

  • dapatkan waktu sistem saat ini: std::chrono::system_clock::now()
  • dapatkan waktu sejak zaman: .time_since_epoch()
  • terjemahkan unit yang mendasarinya menjadi milidetik: duration_cast<milliseconds>(d)
  • terjemahkan std::chrono::millisecondske integer ( uint64_tuntuk menghindari overflow)
#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;
}

Saya menyarankan untuk menggunakan unsigned long longbukan uint64_t.
csg

13

Jika menggunakan gettimeofday Anda harus melakukan long long jika tidak, Anda akan mendapatkan overflow dan karenanya bukan jumlah milidetik semenjak zaman: long int msint = tp.tv_sec * 1000 + tp.tv_usec / 1000; akan memberi Anda nomor seperti 767990892 yang merupakan putaran 8 hari setelah zaman ;-).

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

-25

Sertakan <ctime>dan gunakan timefungsinya.


30
Ini mengembalikan detik sejak zaman. Bukan milidetik.
Progo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.