バイナリファイルから年からミリ秒にかけての日時データ(time_t構造体などのような)を取って、ミリ秒差分を取りたいと思っております。
全ての値をミリ秒値にして、合計値から差分を取るという方法を試しましたが、取るための計算(乗算)が多すぎるというところがあります。
何か円滑に割り出す方法はないでしょうか。
C++
1// 構造体 2struct STDATE 3{ 4 uint8_t Year; ///< 年 0~n 1970年+n年 5 uint8_t Month; ///< 月 1~12 6 uint8_t Day; ///< 日 1~31 7 uint8_t Hour; ///< 時 0~23 8 uint8_t Minutes; ///< 分 0~59 9 uint8_t Seconds; ///< 秒 0~59 10 uint16_t MilliSeconds; ///< ミリ秒 0~999 11};
C++
1//ミリ秒変換サンプル 2STDATE odate = 先データファイル読み込み; 3STDATE ndate = 後データファイル読み込み; 4uint64_t omsec = 0; 5omsec += odate.Year * 12 * 31 * 24 * 60 * 60 * 1000 6omsec += odate.Month * 31 * 24 * 60 * 60 * 1000 7omsec += odate.Day * 24 * 60 * 60 * 1000 8omsec += odate.Hour * 60 * 60 * 1000 9omsec += odate.Minutes * 60 * 1000 10omsec += odate.secounds * 1000; 11omsec += odate.Millisecounds; 12uint64_t nmsec = 0; 13omsec += ndate.Year * 12 * 31 * 24 * 60 * 60 * 1000 14omsec += ndate.Month * 31 * 24 * 60 * 60 * 1000 15omsec += ndate.Day * 24 * 60 * 60 * 1000 16omsec += ndate.Hour * 60 * 60 * 1000 17omsec += ndate.Minutes * 60 * 1000 18omsec += ndate.secounds * 1000; 19omsec += ndate.Millisecounds; 20 21uint64_t diff = nmsec - omsec;
開発環境
OS:Windows10
ツール:Visual Studio2010 Professional
ブラットフォーム(プログラムを稼働させているOS)は何でしょうか? Windowsとか、Linuxとか、macOSとか。OSの提供するAPIやシステムコールを使えば比較的簡単だと思います。自力でカレンダーの計算をしなければいけないのでしょうか。うるう年、うるう秒とか考えるとかなり面倒です。
質問に開発環境を追記しました。
乗算が多いと言っても、最適化で全部消えて定数一つになると思いますが、そもそも自作する必要があるのかも疑問です。
あと、差のみが必要なら、差をとってから乗算したほうが乗算の回数も減るしオーバーフローのリスクも減ります。
というかよく見たら月の日数もうるう年も考慮してないからミリ秒は出ませんね。
1か所でしか使わないので、定数は考えていませんでした。
自作にする理由としましては、読み込むファイル(バイナリ)内に入っている日時情報バイト数に合わせて構造体化して読み込みたかったところにあります。
今後日時情報バイト数が変化することがあっても、それに合わせて自作構造体のメンバ型を変えれば済む、という形にしておきたかったこともあります。
回答5件
あなたの回答
tips
プレビュー