uint
C ++でUNIXタイムスタンプを取得するにはどうすればよいですか?私は少しググったが、ほとんどの方法は時間を表すためのより複雑な方法を探しているようだ。私はそれを単に取得することはできませんuint
か?
7 に答える
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";
}
#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;
}
最も一般的なアドバイスは間違っています、あなたはただ頼ることはできませんtime()
。これは相対的なタイミングに使用されます:ISOC++はそれを指定していませ1970-01-01T00:00Z
んtime_t(0)
さらに悪いことに、それを簡単に理解することもできません。time_t(0)
確かに、のカレンダーの日付を見つけることができますがgmtime
、それがあればどうし2000-01-01T00:00Z
ますか?1970-01-01T00:00Z
との間に何秒ありました2000-01-01T00:00Z
か?うるう秒のため、確かに60の倍数ではありません。
これはグーグルでの最初の結果であり、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を使用していない場合は、自己責任で使用してください。
#include <iostream>
#include <sys/time.h>
using namespace std;
int main ()
{
unsigned long int sec= time(NULL);
cout<<sec<<endl;
}
詳細情報を使用してグローバル定義を作成しました。
#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
これらの行をヘッダーファイルに入れます。これはデバッグなどに非常に役立ちます。
Windowsは異なるエポックと時間単位を使用し ます。Unix/LinuxでのWindowsファイル時間を秒に変換するを参照してください。
std :: time()がWindowsで返すものは、(まだ)私にはわかりません(;-))