DateTime 未指定的种类

DateTime Unspecified Kind

提问人:Zaheer Ahmed 提问时间:5/8/2013 最后编辑:CommunityZaheer Ahmed 更新时间:3/4/2020 访问量:39714

问:

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

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 日下午 02:34:42,种类 = 未指定

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

ToUniversalTime: 2005/5/6 21:34:42, 种类 = UTC

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

C# 日期时间

评论


答:

91赞 Jon Skeet 5/8/2013 #1

不,Unspecified 和 UTC 有很大不同 - 您引用的页面来自 .关键是,如果您使用 “unspecified” 调用,则该值将被视为在 UTC 中。ToLocalTimeToLocalTimeDateTime

同样,如果您使用 “unspecified” 进行调用,则该值将被视为在系统本地时区中。ToUniversalTimeDateTime

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

评论

1赞 Jon Skeet 3/27/2018
@PawelKrakowiak:天哪,真是个老帖子......更新了项目 URL 和博客的 URL。
0赞 Jean-Paul 1/12/2019
旧但仍然有效?@JonSkeet
2赞 Jon Skeet 1/12/2019
@Jean-Paul:据我所知,所有这些仍然有效。
0赞 eddyP23 1/7/2020
是不是有点奇怪?根据对对象调用的方法以不同的方式处理对象。
0赞 Jon Skeet 1/7/2020
@eddyP23:我不确定你所说的“根据你对对象调用的方法以不同的方式对待对象”是什么意思——更多的是该方法的行为取决于值内的状态。
13赞 helios456 10/24/2015 #2

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

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