0

long longVMS タイムスタンプを表す値を取り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;

これはあまり間違っていないように見えますが...これが本当に正しいと誰が保証できますか?

4

3 に答える 3