83

uintC ++でUNIXタイムスタンプを取得するにはどうすればよいですか?私は少しググったが、ほとんどの方法は時間を表すためのより複雑な方法を探しているようだ。私はそれを単に取得することはできませんuintか?

4

7 に答える 7

111

C ++ 20time_since_epochは、UNIXエポックに関連する保証を導入し、cppreference.comは、私が関連するコードに蒸留し、時間ではなく秒の単位に変更した例を示しています。

#include <iostream>
#include <chrono>
 
int main()
{
    const auto p1 = std::chrono::system_clock::now();
 
    std::cout << "seconds since epoch: "
              << std::chrono::duration_cast<std::chrono::seconds>(
                   p1.time_since_epoch()).count() << '\n';
}

C ++ 17以前を使用time()するのが最も簡単な機能です。エポックから数秒で、LinuxとUNIXの場合は少なくともUNIXエポックになります。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";
}
于 2011-05-16T02:26:01.880 に答える
48
#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;
}
于 2011-05-16T02:28:56.473 に答える
18

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

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

于 2011-05-17T08:15:48.850 に答える
11

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

#include <chrono>

//...

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

20より前のバージョンのC++では、system_clockのエポックがUnixエポックであるということは事実上の慣例ですが、標準化されていません。C ++ 20を使用していない場合は、自己責任で使用してください。

于 2019-07-29T14:54:34.640 に答える
7
#include <iostream>
#include <sys/time.h>

using namespace std;

int main ()
{
  unsigned long int sec= time(NULL);
  cout<<sec<<endl;
}
于 2011-05-16T02:29:53.327 に答える
6

詳細情報を使用してグローバル定義を作成しました。

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

#define __FILENAME__ (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)    // only show filename and not it's path (less clutter)
#define INFO std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [INFO] " << __FILENAME__ << "(" << __FUNCTION__ << ":" << __LINE__ << ") >> "
#define ERROR std::cout << std::put_time(std::localtime(&time_now), "%y-%m-%d %OH:%OM:%OS") << " [ERROR] " << __FILENAME__ << "(" << __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] main.cpp(main:6) >> Hello world
16-06-23 21:33:19 [ERROR] main.cpp(main:7) >> Goodbye world

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

于 2016-06-24T02:37:51.390 に答える
5

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

std :: time()がWindowsで返すものは、(まだ)私にはわかりません(;-))

于 2013-11-06T17:31:43.907 に答える