我想格式化一个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日的是1900年1月2日的2.0 。 ,是3.0,依此类推。PropertyBufferSize必须设置为8。“

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

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

最佳答案

看看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();

10-07 20:31