假设转换产生一个有效的值,我如何编写一个 C++ 函数,该函数接受一个long long
表示 VMS 时间戳的值并返回相应的值?(我将在商用 CentOS 服务器上解析通过网络发送的二进制数据,如果这有什么不同的话。)time_t
time_t
我查看了一篇名为“为什么 1858 年 11 月 17 日星期三是 VAX/VMS 的基准时间”的文档,但我认为如果不使用我没有的实际数据进行测试,我无法编写正确的实现不幸的是,现在手。
如果我没记错的话,应该是这种形式的简单算术:
time_t vmsTimeToTimeT(long long v) {
return v/10'000'000 - OFFSET;
}
有人能告诉我要投入什么价值OFFSET
吗?
我关心的事情:
- 我不想被我当地的时区咬伤
- 我不想被修改后的 Julian 日期定义中的 0.5(下午与午夜)所困扰(尽管它在这里应该对我有所帮助;修改后的 Julian 纪元和 Unix 纪元应该相差 24 小时的倍数,这要归功于定义)
我试图在 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;
这看起来不太错,但是......谁能保证这真的是正确的?