標準では指定されていませんが、std::chrono::system_clock::now()
のすべての実装では、Unix Timeのトラッキングが行われていますが、これはUTCに非常に近い値です。あなたは現地時間にstd::chrono::system_clock::now()
を翻訳したい場合は
、あなたはどちらかsystem_clock::to_time_t
経由time_t
へsystem_clock::time_point
を翻訳することができ、その後、C APIを介して(例えばlocaltime
を)あなたのように動作するか、上に構築され、この近代的なタイムゾーンのライブラリを試してみてください<chrono>
のトップ:
https://howardhinnant.github.io/date/tz.html
あなたはこのような現在のローカルタイムを取得するためにこれを使用します。
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
auto t = make_zoned(current_zone(), system_clock::now());
std::cout << t << '\n';
}
make_zoned
は、zoned_time
タイプを返すファクトリ関数です。system_clock
がサポートしています。ナノ秒)。 time_zone
とsystem_clock::time_point
のペアです。
あなたはこのようstd::chrono::time_point
あるlocal_time<Duration>
を取得することができます:ライブラリが自動的にIANA timezone databaseをダウンロードするには、リモートAPIを持ってい
auto t = make_zoned(current_zone(), system_clock::now());
auto lt = t.get_local_time();
std::cout << lt.time_since_epoch().count() << '\n';
ものの、そのAPIは-DHAS_REMOTE_API=0
でコンパイルすることにより無効にすることができます。これはすべてinstallation instructionsに詳述されています。リモートAPIを無効にすると、IANA timezone database(それはちょうどtar.gz
です)からデータベースを手動でダウンロードする必要があります。あなたはこのように得ることができ、現在のUTCオフセット、必要な場合は
:上記のスニペットで
auto t = make_zoned(current_zone(), system_clock::now());
auto offset = t.get_info().offset;
std::cout << offset << '\n';
を、私はoffset
を印刷する同じgithubのリポジトリで発見"chrono_io.h"
の利点を取っています。offset
のタイプはstd::chrono::seconds
です。私にとってこれだけの出力:
-14400s
(-0400)あなたの現在のタイムゾーンのIANA名を検出したい場合は
最後に、それは単純です:
私にとって
std::cout << current_zone()->name() << '\n';
ただ出力:
America/New_York
name()
から返されたタイプがstd::string
です。内部的にUTC以外のものを使用するのは間違いだろう
auto tz_name = current_zone()->name();
// ...
auto t = make_zoned(tz_name, system_clock::now()); // current local time in tz_name
:必要に応じて、一つはその文字列を記録することができ、そしてその後それは、コンピュータの現在のタイムゾーンでない場合であっても、その名前で
time_zone
を使用しています。それを人間のユーザーに表示するときは、現地時間に変換してください。プログラムはUTCでは完璧ですが、サーカディアンのリズムは気にしません。 –n.m. - now()から収集されたデータは、int64形式を使用してローカルおよびクラウドデータベースに格納され、Webサーバーにアップロードされます。最終的なユーザーに表示されます....私は上記のレイヤーでタイムゾーンのトラックを持っていないので、私はデータベースに格納する前に私のC + +コードで正しい時間を取得する必要があります。 – Mendes
@mendesああ神、クラウドデータベースに現地時間を格納しないでください。 *多分*ユーザーが何らかのイベントを設定したときに使用するタイムゾーンを格納する* *ユニバーサルタイムスタンプ(カレンダーアプリケーションの場合、12月7日と7時を選んだ場所)*ローカルタイムはほとんどすべてのケースでユーザーの入力と出力。その場合(選択された時間帯)は、ユーザが何らかの意味で(時間、実際の出来事、または「今から6時間」という意味ではなく)絶対的な時刻*を選んだときです。 – Yakk