4

32 ビットの Dos Date から .NET System.DateTime に変換し、再び元に戻す必要があります。以下の 2 つのルーチンを使用していますが、それらを前後に変換すると、数秒ずれてしまいます。誰でも理由がわかりますか?

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;
}
4

2 に答える 2

5

では、変数 ToDOSDateに格納する前に秒数を 2 で割る必要があります。左シフトで、2 倍になります。これを右ビット単位シフト ( ) に変更して、2 で除算します。time(seconds << 1)seconds(seconds >> 1)

ToDOSDateの秒数が奇数の場合、 で1 秒を失うのを避ける方法はないことに注意してくださいdateTime。2で除算secondsするための右ビット シフトでは、常に最下位ビットが削除されます。

于 2012-08-10T05:52:22.943 に答える
1

例を見ることができます

日付値: 2016-01-25 17:33:04

DOS 値: 1211730978

バイナリ: 0100100 0001 11001 10001 100001 00010

しかし、2番目の値が01の場合、DOS値に0として変換されることがわかりました

于 2016-01-28T12:34:56.833 に答える