1970年から現在のタイムスタンプをミリ秒単位で取得する方法


134

JavaではSystem.currentTimeMillis()、現在のタイムスタンプをエポックタイムからミリ秒単位で取得するために使用できます。

現在時刻と1970年1月1日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;

これは正しいですか?

回答:


239

C ++ 11ライブラリにアクセスできる場合は、ライブラリをチェックアウトしてくださいstd::chrono。これを使用して、次のようなUnixエポックからのミリ秒を取得できます。

#include <chrono>

// ...

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

92
いいね。行の最後にcount()を追加して、基本的な形式でミリ秒数を取得します。
P1r4nh4 2014年

1
@lining:両方のエポックは同じである可能性がありますが、それらの値は異なる場合があります。steady_clock常に前に進みます。これは、そのエポックからの時間の真の測定値ですがsystem_clock、エポックからの論理時間を表す場合もあります。うるう秒ごとに、システムの実装に応じて、2つはさらに離れて成長する可能性があります。
オズ。

4
私の知る限り、各クロックのエポックは実装に依存しています。の慣例はsystem_clock、がUNIXエポックと同じであることですが、仕様では、システム全体のリアルタイムウォールクロックである必要があるとのみ記載されています。がsteady_clock現実に一致する必要はなく、単に前進するだけです。
オズ。

1
@Jason Windowsでgettimeofdayを使用できないことに加えて、クロノライブラリーはより高い解像度を提供し(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、2014

4
まず、これはC ++ではなくCです。次に、gettimeofdayに問題があります。たとえば、これを参照してください。
rustyx 2016

17

この回答はC ++ に使用するOz。の回答にかなり似てい<chrono>ます-私はOzから取得しませんでした。でも...

このページ下部にある元のスニペットを選び、わずかに変更して完全なコンソールアプリにしました。私はこれを使うのが大好きです。多くのスクリプトを作成し、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 2017年

1
@Noitidart使用しているプラ​​ットフォームとC ++コンパイラを教えてください。私はこれを自動化ツールでいつも使用しており、負の出力o.0を見たことはありません。また、それは直接コピー、または修正/統合されたプログラムですか?それがこのコードのみからのものであることを確認したいだけです。
kayleeFrye_onDeck 2017年

5
ああ@kayleeFrye_onDeck私が使っていたのでintint nowms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();。私はそれを奪い、それはうまくいきましたint64_t!役立つ情報を求めてくれてありがとう!
Noitidart 2017年

unsigned long longより移植性が高く、__int64MSVCでのみ使用できます。
SSアン

__int64標準C ++ には型はありません。std::int64_t代わりに使用できます。
jaskmar

14

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

13

gettimeofdayを使用する場合は、long longにキャストする必要があります。そうしないと、オーバーフローが発生し、エポック以降の実際のミリ秒数ではなくなります。long int msint = tp.tv_sec * 1000 + tp.tv_usec / 1000; エポックから8日後のラウンドである767990892のような番号が表示されます;-)。

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.