DateTime未指定种类

时间:2013-05-08 13:50:19

标签: c# datetime

On msdn it is defined for Unspecified Kind as:

  

kind

因此,如果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();
    }
  }
}

将输出显示为:

  

未指定:..... 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对象值?

2 个答案:

答案 0 :(得分:51)

不,未指定且UTC非常不同 - 您引用的网页来自ToLocalTime。关键是,如果您使用“未指定的”ToLocalTime来呼叫DateTime,那么该值将被视为,就像它是UTC一样。

同样,如果您使用“未指定”ToUniversalTime来致电DateTime,则该值将被视为,就好像它位于系统本地时区。

坦率地说,这就是为什么I dislike DateTime rather a lot。如果我是你,我会使用Noda Time代替,它将概念完全分成不同的类型,消除了很多混乱。 (有更多类型需要了解,但每一种都代表一个概念。)我显然有偏见......

答案 1 :(得分:7)

如果您不希望将时间转换为其他本地时间,则DateTimeKind.Unspecified非常有用。

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