34

在 msdn 上,未指定种类定义为:

种类

因此,如果 Kind 未指定 DateTime 是 UTC,但在同一页面上(给定示例):

class Sample 
{
    public static void Main() 
    {
      DateTime saveNow = DateTime.Now;
      myDt = DateTime.SpecifyKind(saveNow, DateTimeKind.Unspecified);
      Display("Unspecified: .....", myDt);
    }

    public static string datePatt = @"M/d/yyyy hh:mm:ss tt";

    public static void Display(string title, DateTime inputDt)
    {
      DateTime dispDt = inputDt;
      string dtString;
    
      dtString = dispDt.ToString(datePatt);
      Console.WriteLine("{0} {1}, Kind = {2}", title, dtString, dispDt.Kind);

      dispDt = inputDt.ToLocalTime();
      dtString = dispDt.ToString(datePatt);
      Console.WriteLine("  ToLocalTime:     {0}, Kind = {1}", dtString, dispDt.Kind);

      dispDt = inputDt.ToUniversalTime();
      dtString = dispDt.ToString(datePatt);
      Console.WriteLine("  ToUniversalTime: {0}, Kind = {1}", dtString, dispDt.Kind);
      Console.WriteLine();
    }
  }
}

输出为:

未指定:..... 2005 年 5 月 6 日下午 2:34:42,种类 = 未指定

ToLocalTime:2005 年 5 月 6 日上午 7:34:42,种类 = 本地

ToUniversalTime:5/6/2005 09:34:42 PM,Kind = Utc

所以,我遇到的问题是,如果 Unspecified 是 Utc,那么为什么 Utc 到 Utc 的转换会更改 datetime 对象值?

4

2 回答 2

77

不,未指定和 UTC 非常不同 - 您引用的页面来自ToLocalTime. 关键是,如果您ToLocalTime使用 "unspecified"调用DateTime,则该值将被视为UTC格式。

同样,如果您ToUniversalTime使用 "unspecified"调用DateTime,则该值将被视为系统本地时区中。

坦率地说,这种事情是我非常不喜欢DateTime原因。如果我是你,我会改用Noda Time,它将概念完全分成不同的类型,消除了很多混乱。(有更多类型需要了解,但每种类型都代表一个概念。)虽然我显然有偏见......

于 2013-05-08T13:53:22.650 回答
11

DateTimeKind.Unspecified 在您不希望将时间转换为另一个本地时间的情况下很有用。

以服务器应用程序为例,它在客户端应用程序中显示服务器的当前时间。如果在服务器上没有指定 DateTimeKind.Unspecified 并且当前时间是通过 WCF 调用检索的,那么当在客户端应用程序中调用 .ToString 时,如果它们不同,它将自动转换为本地时区。

于 2015-10-23T17:10:05.780 回答