2 回答
TA贡献1846条经验 获得超7个赞
自己进行位掩码和杂耍并不是非常棘手,但是如果您只想“使用现成的东西”,我认为最简单的方法是调用本机代码。
将两个组件一分为二UInt16,调用DosDateTimeToFileTime.
[DllImport("kernel32", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
private static extern int DosDateTimeToFileTime(ushort dateValue, ushort timeValue, out UInt64 fileTime);
public static DateTime FromDosDateTime(ushort date, ushort time)
{
UInt64 fileTime;
if(DosDateTimeToFileTime(date, time, out fileTime) == 0) {
throw new Exception($"Date conversion failed: {Marshal.GetLastWin32Error()}");
}
return DateTime.FromFileTime(Convert.ToInt64(fileTime));
}
TA贡献1789条经验 获得超10个赞
一个结构来转换为/从 16 + 16 位日期/时间......显然使用按位运算!:-)
public struct DosDateTime
{
public ushort Date;
public ushort Time;
public int Year
{
get => ((Date >> 9) & 0x7F) + 1980;
set => Date = (ushort)((Date & 0x1FF) | ((value - 1980) << 9));
}
public int Month
{
get => (Date >> 5) & 0xF;
set => Date = (ushort)((Date & 0xFE1F) | (value<< 5));
}
public int Day
{
get => Date & 0x1F;
set => Date = (ushort)((Date & 0xFFE0) | value);
}
public int Hour
{
get => (Time >> 11) & 0x1F;
set => Time = (ushort)((Time & 0x7FF) | (value << 11));
}
public int Minute
{
get => (Time >> 5) & 0x3F;
set => Time = (ushort)((Time & 0xF81F) | (value << 5));
}
public int Second
{
get => (Time & 0x1F) << 1;
set => Time = (ushort)((Time & 0xFFE0) | (value >> 1));
}
}
这两个ushort Date和Time是由DOS FAT日期时间结构中使用“格式”(因为这是使用的格式,旧的FAT文件系统的一个)。各种属性由两个Date/Time字段“支持”并进行正确的按位计算。
- 2 回答
- 0 关注
- 266 浏览
添加回答
举报