web-dev-qa-db-ja.com

C ++でUnixタイムスタンプを取得する

C++でuint unixタイムスタンプを取得するにはどうすればよいですか?私は少しグーグルで調べましたが、ほとんどの方法は時間を表すより複雑な方法を探しているようです。 uintとして取得することはできませんか?

54
2rs2ts

time() は最も単純な関数です-エポックからの秒数。 Linuxのマンページ ここ

上記のリンクされたcppreferenceページはこれを与えます

#include <ctime>
#include <iostream>

int main()
{
    std::time_t result = std::time(nullptr);
    std::cout << std::asctime(std::localtime(&result))
              << result << " seconds since the Epoch\n";
}
61
Tony Delroy
#include<iostream>
#include<ctime>

int main()
{
    std::time_t t = std::time(0);  // t is an integer type
    std::cout << t << " seconds since 01-Jan-1970\n";
    return 0;
}
35
wilhelmtell

最も一般的なアドバイスは間違っています。time()だけに頼ることはできません。これは相対的なタイミングに使用されます。ISOC++は1970-01-01T00:00Ztime_t(0)であることを指定していません

さらに悪いことに、あなたはそれを簡単に理解することもできません。確かに、gmtimetime_t(0)のカレンダー日付を見つけることができますが、それが2000-01-01T00:00Zの場合はどうしますか? 1970-01-01T00:00Z2000-01-01T00:00Zの間には何秒ありましたか?うるう秒のため、確かに60の倍数ではありません。

15
MSalters
#include <iostream>
#include <sys/time.h>

using namespace std;

int main ()
{
  unsigned long int sec= time(NULL);
  cout<<sec<<endl;
}
5
anijhaw

Windowsは異なるエポックと時間単位を使用します: nix/LinuxでWindowsファイル時間を秒に変換する を参照してください

Windowsでstd :: time()が返すものは(まだ)私には不明です(;-))

4
davecb

詳細を含むグローバル定義を作成しました:

#include <iostream>
#include <ctime>
#include <iomanip>

#define INFO std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [INFO] " << __FILE__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> "
#define ERROR std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [ERROR] " << __FILE__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> "

static std::time_t time_now = std::time(nullptr);

次のように使用します。

INFO << "Hello world" << std::endl;
ERROR << "Goodbye world" << std::endl;

サンプル出力:

16-06-23 21:33:19 [INFO] src/main.cpp(main:6) >> Hello world
16-06-23 21:33:19 [ERROR] src/main.cpp(main:7) >> Goodbye world

これらの行をヘッダーファイルに入れます。これはデバッグなどに非常に役立ちます。

2
xinthose

これはグーグルでの最初の結果であり、C++ 11の答えはまだないので、std :: chronoを使用してこれを行う方法は次のとおりです。

    #include <chrono>

    ...

    using namespace std::chrono;
    int64_t timestamp = duration_cast<milliseconds>(system_clock::now().time_since_Epoch()).count();

この答えはエポックが1970/1/1であることを保証するものではありませんが、実際にはそうである可能性が非常に高いことに注意してください。

1
Tharwen