.Net DateTime to DOS Date 32-bit Conversion

I need to convert from 32-bit DOS date to .NET System.DateTime and vice versa. I use the two routines below, however, when I convert them back and forth, they exit for a few seconds. Can anyone understand why?

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
source share
2 answers

In ToDOSDate number of seconds must be split in two before being stored in the time variable. (seconds << 1) a left shift that multiplies seconds by two. Change this to the right bitwise shift ( (seconds >> 1) ) to split into two.

Note that there is no way to avoid losing a second in ToDOSDate when there is an odd number of seconds in dateTime . A correct bit shift to divide seconds by two will always decrease the least significant bit.

+5
source

You can see an example

Date Value: 2016-01-25 17:33:04

DOS Value: 1211730978

Binary: 0100100 0001 11001 10001 100001 00010

But I found that when the second value is 01, we convert the DOS value to 0

+1
source

All Articles