在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,它将概念完全分成不同的类型,消除了很多混乱.(有更多类型需要了解,但每个类型代表一个概念.)我显然有偏见...
如果您不希望将时间转换为另一个本地时间,则DateTimeKind.Unspecified非常有用.
以服务器应用程序为例,该应用程序在客户端应用程序中显示服务器的当前时间.如果未在服务器上指定DateTimeKind.Unspecified并且通过WCF调用检索当前时间,则在客户端应用程序中调用.ToString时,如果它们不同,它将自动转换为本地时区.