日期时间未指定类型

39

在msdn上,对于未指定Kind的情况,它被定义为:

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

输出结果为:

未指定: ..... 2005/5/6 下午2:34:42,时区 = 未指定

ToLocalTime: 2005/5/6 上午7:34:42,时区 = 本地时间

ToUniversalTime: 2005/5/6 下午9:34:42,时区 = 协调世界时

因此,我对此的问题是,如果未指定为协调世界时,则为什么从协调世界时转换为协调世界时会更改日期时间对象的值?

2个回答

91
不,未指定和UTC非常不同 - 您引用的页面来自ToLocalTime。关键是,如果您使用“未指定”DateTime调用ToLocalTime,则该值将被视为在UTC中。
同样,如果您使用“未指定”DateTime调用ToUniversalTime,则该值将被视为在系统本地时区。
坦白说,这就是为什么我非常不喜欢 DateTime 这种事情。如果我是您,我会使用Noda Time,它将概念完全分开为不同的类型,从而消除了许多混乱。(还有更多要了解的类型,但每个类型都代表一个单一的概念。)我显然有偏见...

1
@PawelKrakowiak:天哪,这是一篇老帖子了...已更新项目URL和博客的链接。 - Jon Skeet
老旧但仍然有效吗?@JonSkeet - Jean-Paul
2
@Jean-Paul: 据我所知,所有这些信息仍然有效。 - Jon Skeet
这不是有点奇怪吗?根据调用的方法不同而对待对象不同。 - eddyP23
@eddyP23:我不确定你所说的“根据调用它的方法来不同处理对象”是什么意思——更确切地说,这个方法的行为取决于值内部的状态。 - Jon Skeet
显示剩余3条评论

13

DateTimeKind.Unspecified 在不想将时间转换为另一个本地时间的情况下非常有用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接