正如标题所示,在我为时区UTC分配DateTime对象后,它在分配给DataRow时会丢失其TimeZone信息。
static void Main(string[] args)
{
DateTime universalTime = DateTime.UtcNow;
DataTable table = new DataTable();
table.Columns.Add("Time", typeof(DateTime));
DataRow row = table.NewRow();
row["Time"] = universalTime;
/* writes Kind: Utc */
Console.WriteLine("Universal time : " + universalTime + ", kind: " + universalTime.Kind);
/* writes Kind: Unspecified */
Console.WriteLine("Same time in DataRow: " + row["Time"] + ", kind: " + ((DateTime)row["Time"]).Kind);
Console.ReadKey();
}
分配给DataRow后,它说Kind = Unspecified。
这是DataRow中的错误还是我在这里做错了什么?
答案 0 :(得分:0)
我怀疑这是因为您的持久层的datetime
数据类型中没有可用的时区信息。
例如,在SQL Server上,datetime
类型没有时区信息。因此,DateTime
类型的任何C#值都只存储其值。这与Linq-to-SQL和Entity Framework的工作方式类似。
我的解决方法通常是确定所有持久DateTime
值的时区(UTC),并在持久性和检索之后进行转换。
这样的事情:
public DateTime InputTime(DateTime time) {
if (time.Kind == DateTimeKind.Unspecified) {
throw new ArgumentException("Time values cannot be input to the data store with unspecified kind.");
}
return time.ToUniversalTime();
}
public DateTime OutputTime(DateTime time) {
if (time.Kind == DateTimeKind.Unspecified) {
time = DateTime.SpecifyKind(time, DateTimeKind.Utc);
}
return time.ToUniversalTime();
}