DateTime未指定种类

Zah*_*med 24 c# datetime

在msdn上,它被定义为Unspecified Kind as:

类

因此,如果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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出为:

未指定:..... 5/6/2005 02:34:42 PM,种类=未指定

ToLocalTime:5/6/2005 07:34:42 AM,Kind = Local

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

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

Jon*_*eet 56

不,未指定和UTC非常不同 - 您引用的页面来自ToLocalTime.问题的关键是,如果你调用ToLocalTime使用"未指定" DateTime,则该值将被视为仿佛它是在UTC.

同样,如果你调用ToUniversalTime使用"未指定" DateTime,则该值将被视为好像它是系统中的本地时区.

坦率地说这样的事情是为什么我不喜欢DateTime,而很多.如果我是你,我会使用Noda Time,它将概念完全分成不同的类型,消除了很多混乱.(有更多类型需要了解,但每个类型代表一个概念.)我显然有偏见...

  • @Jean-Paul:据我所知,所有这些仍然有效。 (2认同)

hel*_*456 8

如果您不希望将时间转换为另一个本地时间,则DateTimeKind.Unspecified非常有用.

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