将DateTime分配给DataRow时,C#时区信息丢失
本文关键字:时区 信息 DateTime 分配 DataRow | 更新日期: 2023-09-27 18:22:17
正如标题所说,在我分配时区为UTC的DateTime对象后,当分配给DataRow时,它会丢失时区信息。
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中的错误还是我在这里做错了什么?
我怀疑这是因为在持久层的datetime
数据类型中没有可用的时区信息。
例如,在SQL Server上,datetime
类型没有时区信息。因此,任何类型为DateTime
的C#值都只存储其值。这类似于Linq-to-SQL和实体框架的工作方式。
我的工作通常是为所有持久化的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();
}