c++ - 如何处理 "variant time"(日期, double ,8 字节)?

标签 c++ datetime time com variant

我似乎找不到任何关于如何处理“变量时间”( DATE, double ,8 字节变量)的信息.... 我有一个变体时间“A”,其值为“41716.892329”。 如果我使用“VariantTimeToSystemTime”(或“COleDateTime”)转换“A” - 我得到“2014-03-18 21:24:57”。

  • 这个变体时间是如何计算的?
  • 是否能够存储毫秒数?
  • 有什么方法可以确定变量时间是上午时间还是下午时间?

我对 AM/PM 有点困惑,因为当时我正在使用的设备设置为“09:24:57”(AM)而不是“21:24:57"(下午)。

这可能是设备 SDK 的问题,它为我提供了不正确的变量时间吗?

编辑:这是设备中时区设置不正确的问题(设置为“GMT-12:00”而不是“GMT-00:00” )

谢谢。

最佳答案

“可变时间”(DATE) 与 Excel 日期几乎相同但不完全相同。 Excel(因为它最初是与 Lotus-123 竞争)复制了 Lotus 存储日期的方式(为了与现有用户兼容)。不幸的是,Lotus 有一个错误(可能是故意的,请参阅 Joel Spolsky's blog ),这意味着 1900 年 2 月有 29 天。因此,Excel 还认为 1900 年 2 月有 29 天(仍然)。尝试将值 60 格式化为日期。但是,“可变时间”用于 OLE 自动化(不仅在 Excel 中)并已修复,因此它可以正确表示任何时间点,最初是在 1753 年 1 月 1 日和 2078 年 12 月 31 日之间(ca. 2006 ) 但现在是在 100 年 1 月 1 日和 9999 年 12 月 31 日 ( 12/05/2018 ) 之间,这样可以通过简单的(可能是两部分,见下文)获得时差减法。

Eric Lippert有一个全面的分析,但总结是:

“变量时间”是一个 double ,其中整数部分是 30dec1899 之后的天数。因此,0 是 30dec1899,而 01jan1900 实际上是 2(与复制 Lotus 并将其定义为第 1 天的 Excel 不同)并且没有 29feb1900。 十进制字符串表示 的小数部分被视为从当天 00:00:00 开始的无符号部分日期偏移量。此处措辞的意义在于,虽然在数值上 -1.75 与 -1 + -0.75 相同,但变体时间将 -1.75 视为 -1++0.75(即 之后一天的 3/4 1899 年 12 月 29 日午夜)。因此,在将负值转换为 YYYY/MM/DD HH:MM:SS 或计算涉及负值的日期差异时,必须将日期和时间部分分开处理。

关于c++ - 如何处理 "variant time"(日期, double ,8 字节)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22476192/

相关文章:

python - 在午夜 00 点重新采样 - 计算最小值、最大值平均值 - 自定义标签

Linux 时间和日期

java - 如何在 Java 中将十进制数转换为日期和时间?

c++ - 专门化模板类的功能

python - 有没有最好的方法可以在 Python 中将给定的天数更改为年月周天?

python - 使用 Series.plot() 绘制每小时数据

ios - NSCalendar 显示为军用时间但位置使用 12 小时制 (Swift/iOS)

c++ - 我可以在类之外定义私有(private)模板函数吗?

c++ - OpenGL 帧缓冲区,绘制到纹理

c++ - 当您在 SDL2 中移动窗口时,如何解决程序卡住问题?