サーバ側(.NETアプリケーションを実行している)からuint64_tの値を標準のC++(WindowsとLinux上で実行する必要がある)で書かれたアプリケーションに取得します。C++である環境から別の環境に時間を変換する
この数値は、Windowsファイル時間を表します(エポックが1601-01-01 00:00:00 UTC以降の100ナノ秒間隔)。
私はアプリケーションの中で時間の文字列表現を返す必要があります。これは正確にナノ秒(正確にはサーバーからの値になります)です。したがって、クロノライブラリを使用する必要があります。
C++の時代は1970年1月1日から1970年1月1日までですから、まず1970年から1601年までのオフセットを計算し、それをサーバーから取得した数値から差し引く必要があります。これを行うには、まず、私がchrono :: time_pointとして取得した値を表現して、1001ナノ秒の間隔でエポック1601-01-01 00:00:00 UTCを計算する必要があります。私は同じ規模になっています。
私はaddjustedTimeFromServerを持っています。これは、サーバーからマイナス(chrono :: time_point形式で)のオフセットを取得した値です。精度で値を抽出するには、std :: time_tに変換する必要があります秒、次にクロノから:: time_point私はナノ秒の精度を与えるfractional_secondsを抽出する必要があり、私は時間を表す文字列にそれらを連結します。
ここに私のコードです。
using FileTime = duration<int64_t, ratio<1, 10000000>>;
struct std::tm tm;
//create time point for epoch of Windows Filetime (1601-01-01 00:00:00 UTC))
std::istringstream ss("1601-01-01 00:00:00");
ss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S");
std::time_t tt = mktime(&tm);
std::chrono::system_clock::time_point offset =std::chrono::system_clock::from_time_t(tt);
//convert the offset into 100-nanosecond intervals scale
auto offset_ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(offset);
auto offset_100ns = FileTime(offset_ns.time_since_epoch());
//substract the offset from i so now it starts from 1970 like the epoch of C++
auto iDuration = FileTime(static_cast<int64_t>(i));
//auto iDuration_ns = std::chrono::time_point_cast<std::chrono::nanoseconds>(iDuration); //doesn't compile - but that's the idea of what i want to do in this line
std::chrono::system_clock::time_point adjustedTime = iDuration/*iDuration_ns*/ - offset /*-offset_100ns*/; //the commented out parts are what i think is the correct thing to do (scale wise) but they don't compile
//convert the time_point into the string representation i need (extract the regular time, up to seconds, with time_t and the nanosecond part with ns.count())
nanoseconds ns = duration_cast<nanoseconds>(adjustedTime.time_since_epoch());
seconds s = duration_cast<seconds>(ns);
std::time_t t = s.count();
std::size_t fractional_seconds = ns.count() % 10000000;
std::cout << std::ctime(&t) << std::endl;
std::cout << fractional_seconds << std::endl;
(でもすべてのスケール変換の問題の前に)コードが動作しないと私はit.The最初の問題を解決するかどうかはわからないことはmktimeです(& TM:それは私が必要なものを行いません)私に間違った価値を与えます。 tmはC++エポック以前の値を表すので、mktime(& tm)は-1を返します。私は何とかそれを克服する必要があるので、私は.NET Filetimeエポック(1601-01-01 00:00:00 UTC)のtime_pointを計算しなければならないので、それをサーバーから取得する値から減算する必要があります。
私は、この問題と一般的なプログラムのヘルプを歓迎します。私はこのコードで印刷が、最終バージョンでは、私が実際に寄贈されたのと同じ文字列(CTIMEにより与えられる部分(& t)とfractional_secondsにおける一部)
タイプFILETIMEは私の踏査では認識されません。純粋なC++コードを書いているので、私は.NETオブジェクトを持っていません。私は、FILETIMEを表すサーバーのuint64_t値から取得します。このコードでuint64_tを使用する方法はありますか? – primeQuestion
ああ、確かに、ちょっと分かりまして、私は答えを編集します... –
ありがとうたくさん:) – primeQuestion