diff --git a/CSharp/Libraries/UniversalEditor.Core/IO/Writer.cs b/CSharp/Libraries/UniversalEditor.Core/IO/Writer.cs index 5eaa4f83..345541ef 100644 --- a/CSharp/Libraries/UniversalEditor.Core/IO/Writer.cs +++ b/CSharp/Libraries/UniversalEditor.Core/IO/Writer.cs @@ -645,6 +645,41 @@ namespace UniversalEditor.IO WriteInt64(value.ToBinary()); } + /// + /// Encodes a into a 32-bit value as used in MS-DOS and Windows FAT directory entries. + /// + /// Date time. + /// + /// Each portion of the time stamp (year, month etc.) is encoded within specific bits of the 32-bit timestamp. The epoch for this time format is 1980. This format has a granularity of 2 seconds. + /// + public void WriteDOSFileTime(DateTime dateTime) + { + // The 32 bit date and time format used in the MSDOS and Windows FAT directory entry + + // Year Month Day Hour Min Seconds / 2 + // Bits 31-25 24-21 20-16 15-11 10-5 4-0 + + /* + cal.set(Calendar.YEAR, (int)((dosTime >> 25) & 0x7F) + 1980); + cal.set(Calendar.MONTH, (int)((dosTime >> 21) & 0x0f) - 1); + cal.set(Calendar.DATE, (int)(dosTime >> 16) & 0x1f); + cal.set(Calendar.HOUR_OF_DAY, (int)(dosTime >> 11) & 0x1f); + cal.set(Calendar.MINUTE, (int)(dosTime >> 5) & 0x3f); + cal.set(Calendar.SECOND, (int)(dosTime << 1) & 0x3e); + cal.set(Calendar.MILLISECOND, 0); + */ + + uint seconds = (uint)(dateTime.Second / 2); + uint min = (uint)dateTime.Minute; + uint hour = (uint)dateTime.Hour; + uint day = (uint)dateTime.Day; + uint month = (uint)dateTime.Month; + uint year = (uint)dateTime.Year - 1973; // huh? + + uint value = 0;//e (seconds | (min << 6) | (hour << 11) | (day << 16) | (month << 21) | (year << 25)); + WriteUInt32(value); // (int)(dateTime.Second / 2)); + } + /// /// Writes a four-byte floating-point value to the current stream and advances the stream position by four bytes. ///