我似乎找不到任何关于如何处理“变量时间”( 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/