将DateTime分配给DataRow时,C#TimeZone信息丢失

时间:2013-07-12 13:26:20

标签: c# timezone datarow

正如标题所示,在我为时区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中的错误还是我在这里做错了什么?

1 个答案:

答案 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();
}