Today’s Little Program does the reverse of what we had last time. It takes a point in time and then generates timestamps in various formats.
using System;
class Program
{
static void TryFormat(string format, Func<long> func)
{
try {
long l = func();
if ((ulong)l > 0x00000000FFFFFFFF) {
Console.WriteLine("{0} 0x{1:X16}", format, l);
} else {
Console.WriteLine("{0} 0x{1:X08}", format, l);
}
} catch (ArgumentException) {
Console.WriteLine("{0} - invalid", format);
}
}
Like last time, the TryFormat method executes the passed-in function inside a try/catch block. If the function executes successfully, then we print the result. There is a tiny bit of cleverness where we choose the output format depending on the number of bits in the result.
static long DosDateTimeFromDateTime(DateTime value)
{
int result = ((value.Year - 1980) << 25) |
(value.Month << 21) |
(value.Day << 16) |
(value.Hour << 11) |
(value.Minute << 5) |
(value.Second >> 1);
return (uint)result;
}
The DosDateTimeFromDateTime converts the DateTime into a 32-bit date/time stamp in MS-DOS format. This is not quite correct because MS-DOS format date/time stamps are in local time, but we are not converting the incoming DateTime to local time. It’s up to you to understand what’s going on.
public static void Main(string[] args)
{
int[] parts = new int[7];
for (int i = 0; i < 7; i++) {
parts[i] = args.Length > i ? int.Parse(args[i]) : 0;
}
DateTime value = new DateTime(parts[0], parts[1], parts[2],
parts[3], parts[4], parts[5],
parts[6], DateTimeKind.Utc);
Console.WriteLine("Timestamp {0} UTC", value);
TryFormat("Unix time",
() => value.ToFileTimeUtc() / 10000000 - 11644473600);
TryFormat("UTC FILETIME",
() => value.ToFileTimeUtc());
TryFormat("Binary DateTime",
() => value.ToBinary());
TryFormat("MS-DOS Date/Time",
() => DosDateTimeFromDateTime(value));
TryFormat("OLE Date/Time",
() => BitConverter.DoubleToInt64Bits(value.ToOADate()));
}
}
The parameters on the command line are the year, month, day, hour, minute, second, and millisecond; any omitted parameters are taken as zero. We create a UTC DateTime from it, and then try to convert that DateTime into the other formats.
0 comments