3

正如标题所说,在我为 DateTime 对象分配时区 UTC 后,它在分配给 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 中的错误还是我在这里做错了什么?

4

1 回答 1

0

我怀疑这是因为持久层的datetime数据类型中没有可用的时区信息。

例如,在 SQL Server 上,该datetime类型没有时区信息。因此,任何类型的 C# 值DateTime都只存储其值。这类似于 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();
}
于 2013-07-12T13:37:47.460 回答