达网络的DateTime到DOS日期32位转换(.Net DateTime to DOS Date

2019-09-21 02:15发布

我需要从一个32位DOS日期到一个.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;
}

Answer 1:

ToDOSDate ,需要的秒数,以被两个被存储在划分之前time可变的。 (seconds << 1)左移位,它乘seconds由两个。 改变至右按位移位( (seconds >> 1)除以2。

请注意,有没有办法避免失去在第二ToDOSDate当有奇数个以秒dateTime 。 右位移位来划分seconds由两个总是会掉落至少显著位。



Answer 2:

你可以看到一个例子

时间价值:2016年1月25日17时33分04秒

DOS值:1211730978

二进制:0100100 0001 11001 10001 100001 00010

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



文章来源: .Net DateTime to DOS Date 32 bit Conversion