【问题标题】:How to properly format a DEVPROP_TYPE_DATE?如何正确格式化 DEVPROP_TYPE_DATE?
【发布时间】:2015-10-10 22:12:59
【问题描述】:

我想格式化 DEVPROP_TYPE_DATE 值。官方文档说:

“在 Windows Vista 和更高版本的 Windows 中,DEVPROP_TYPE_DATE 属性类型表示基本数据类型标识符,该标识符指示数据类型是一个 DOUBLE 类型的值,该值指定自 12 月 31 日以来的天数, 1899。例如,1900 年 1 月 1 日为 1.0;1900 年 1 月 2 日为 2.0;以此类推。”

DEVPROPERTY structure 文档说:

“DEVPROP_TYPE_DATE - 日期(DATE)”

到目前为止,一切都很好!可是等等! DEVPROP_TYPE_DATE 格式类似,但不等于DATE 数据类型格式:

“DATE 类型是使用 8 字节浮点数实现的。天以整数增量表示,从 1899 年 12 月 30 日开始,午夜作为时间零。例如:1899 年 12 月 30 日,午夜是 0.00,1900 年 1 月 1 日,午夜是 2.00。"

我发现一个PDF document 说:

"DEVPROP_TYPE_DATE - 日期值。PropertyBuffer 指定一个 64 位浮点数,表示自 1899 年 12 月 31 日以来的天数(不是秒数)。例如,1 月 1 日, 1900 是 2.0,1900 年 1 月 2 日是 3.0,依此类推。PropertyBufferSize 必须设置为 8。"

在我看来有很多错别字,但我不确定。我还发现 DATE 数据类型有很长的历史和一些weirdness。有人可以帮我澄清DEVPROP_TYPE_DATE 值的正确格式是什么?

P.S.:我正在制定 B 计划以显示该值并将其与设备管理器显示的值进行比较。它并不完美,但足够接近。

【问题讨论】:

  • 怀疑该差异是因为对于短语“1900 年 1 月 1 日”是指 12 月 31 日变为 1 月 1 日的时刻还是 1 月 1 日的时刻存在分歧变为 1 月 2 日。甚至“1900 年 1 月 1 日,午夜”对我来说似乎也是模棱两可的。如果我是对的,那么差异本身就解决了歧义:1900 年 1 月 1 日开始的时刻是 1.0,而结束的时刻是 2.0。 但我只是猜测,所以如果没有人能给你一个明确的答案,请确保你自己测试一下。
  • 我要测试并发布结果。谢谢@HarryJohnston!

标签: c++ windows wdk


【解决方案1】:

看看DateTime.ToOADate() 方法。

假设数据是一个指向日期字节的 IntPtr:

using System;
using System.Runtime.InteropServices;

var Bytes = new byte[8];
Marshal.Copy(data, Bytes, 0, 8);
var d = BitConverter.ToDouble(Bytes, 0);
var Value = DateTime.FromOADate(d).ToString();

【讨论】:

  • 您是否有任何参考资料支持设备管理器使用的日期与 OLE 自动化日期格式相同的假设?
  • 不,我没有找到。但是 OLE 自动化日期的描述与设备日期非常相似。
猜你喜欢
  • 2012-06-13
  • 1970-01-01
  • 2014-02-27
  • 2012-02-15
  • 2016-05-10
  • 2014-01-07
  • 1970-01-01
  • 2015-02-10
  • 2021-06-05
相关资源
最近更新 更多