如何正确格式化DEVPROP_TYPE_DATE?

时间:2015-10-10 22:12:59

标签: c++ windows wdk

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

"在Windows Vista和更高版本的Windows中,DEVPROP_TYPE_DATE属性类型表示基本数据类型标识符,该标识符指示数据类型是DOUBLE类型的值,指定自以来的天数1899年12月31日。例如, 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日以来的天数(而不是秒数)。例如, 1900年1月1日,2.0 ,1900年1月2日,是3.0,依此类推。 PropertyBufferSize必须设置为8。"

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

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

1 个答案:

答案 0 :(得分:-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();