将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分配给DataRow时,C#时区信息丢失

我怀疑这是因为在持久层的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();
}