long long
VMS タイムスタンプを表す値を取りtime_t
、変換によって有効なtime_t
. (ネットワーク経由で送信されたバイナリ データをコモディティ CentOS サーバーで解析します。違いがある場合)。
「1858 年 11 月 17 日水曜日が VAX/VMS の基本時間である理由」というタイトルのドキュメントを調べましたが、実際のデータでテストせずに正しい実装を書くことはできないと思います。残念ながら、今すぐ手に入れてください。
私が間違っていなければ、次の形式の単純な算術演算である必要があります。
time_t vmsTimeToTimeT(long long v) {
return v/10'000'000 - OFFSET;
}
に入れる値を誰か教えてもらえますOFFSET
か?
気になる点:
- ローカルタイムゾーンに惑わされたくない
- 修正ユリウス日の定義で 0.5 のこと (午後と真夜中) に悩まされたくありません (ただし、ここでは役立つはずです。修正ユリウス暦エポックと Unix エポックは、意味)
Boost.DateTime の助けを借りて自分で計算しようとしましたが、不思議な負の値が得られました...
int main() {
boost::posix_time::ptime x(
boost::gregorian::date(1858, boost::gregorian::Nov, 17),
boost::posix_time::time_duration(0, 0, 0) );
boost::posix_time::ptime y(
boost::gregorian::date(1970, boost::gregorian::Jan, 1),
boost::posix_time::time_duration(0, 0, 0) );
std::cout << (y - x).total_seconds() << std::endl;
std::cout << (y > x ? "y is after x" : "y is before x") << std::endl;
}
-788250496
y は x の後です
Boost 1.60を使用しました:
現在の実装では、1400-Jan-01 から 9999-Dec-31 の範囲の日付がサポートされています。
アップデート
がらくた、sizeof(total_seconds())
4 だった、ドキュメントが言うことにもかかわらず
だから私はから3506716800を得ました
auto diff = y - x;
std::cout << diff.ticks() / diff.ticks_per_second() << std::endl;
これはあまり間違っていないように見えますが...これが本当に正しいと誰が保証できますか?