.Net DateTime到DOS日期32位转换

时间:2012-08-10 04:11:23

标签: .net datetime type-conversion dos bit-manipulation

我需要从32位Dos Date转换为.NET System.DateTime并再次返回。我正在使用下面的两个例程,但是当我来回转换它们时,它们会在几秒钟内完成。谁能明白为什么?

public static DateTime ToDateTime(this int dosDateTime)
{
    var date = (dosDateTime & 0xFFFF0000) >> 16;
    var time = (dosDateTime & 0x0000FFFF);

    var year = (date >> 9) + 1980;
    var month = (date & 0x01e0) >> 5;
    var day =  date & 0x1F;
    var hour = time >> 11;
    var minute = (time & 0x07e0) >> 5;
    var second = (time & 0x1F) * 2;

    return new DateTime((int)year, (int)month, (int)day, (int)hour, (int)minute, (int)second);
}

public static int ToDOSDate(this DateTime dateTime)
{
    var years = dateTime.Year - 1980;
    var months = dateTime.Month;
    var days = dateTime.Day;
    var hours = dateTime.Hour;
    var minutes = dateTime.Minute;
    var seconds = dateTime.Second;

    var date = (years << 9) | (months << 5) | days;
    var time = (hours << 11) | (minutes << 5) | (seconds << 1);

    return (date << 16) | time;
}

2 个答案:

答案 0 :(得分:5)

ToDOSDate中,在存储到time变量之前,需要将秒数除以2。 (seconds << 1)左移,将seconds乘以2。将其更改为右移位((seconds >> 1))除以2。

请注意,ToDOSDate中的奇数秒数时,无法避免在dateTime中丢失秒。向右移位以将seconds除以2将始终降低最低有效位。

答案 1 :(得分:1)

You can see an example

日期值:2016-01-25 17:33:04

DOS值:1211730978

Binary:0100100 0001 11001 10001 100001 00010

但是,我发现第二个值为01时,我们将DOS值转换为0