使用 C# 读写 MongoDB 时,DateTime 常常在 Unspecified、Local 和 Utc 之间转换,搞不清楚的话很容易弄错。最近写程序弄错了两次,数据老是重复,刚开始一直找不到问题,浪费了两天时间,坑爹啊。今天查资料、写测试、找源码,整了两个多小时,终于搞清楚了。
关于 DateTimeKind
// DateTimeKind.Local
DateTime td = DateTime.Today;
// DateTimeKind.Unspecified
DateTime dt1 = new DateTime(1999, 1, 1);
// 输出:dt1:1999-01-01 00:00:00, Ticks:630507456000000000
Console.WriteLine("dt1:{0}, Ticks:{1}", dt1, dt1.Ticks);
DateTime dt2 = new DateTime(1999, 1, 1, 0, 0, 0, DateTimeKind.Local);
// 输出:dt2:1999-01-01 00:00:00, Ticks:630507456000000000
Console.WriteLine("dt2:{0}, Ticks:{1}", dt2, dt2.Ticks);
DateTime dt3 = new DateTime(1999, 1, 1, 0, 0, 0, DateTimeKind.Utc);
// 输出:dt3:1999-01-01 00:00:00, Ticks:630507456000000000
Console.WriteLine("dt3:{0}, Ticks:{1}", dt3, dt3.Ticks);
Console.WriteLine(dt1 == dt2); // 输出:True
Console.WriteLine(dt1 == dt3); // 输出:True
Console.WriteLine(dt2 == dt3); // 输出:True
查看 DateTime 源代码可知,虽然三个时间的 DateTimeKind 不同,但 Ticks 值是一样的,而 DateTi