DateTime.ToString()不转换时间

Ric*_*ard 1 .net c# datetime type-conversion

看起来转换期间时间会自动更改.我的意见是17:15:25.然而,它被转换为13:15:25 可能是什么原因?

string testDate = Convert.ToDateTime("2016-03-24T17:15:25.879Z")
                         .ToString("dd-MMM-yyyy HH:mm:ss", CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

我得到的结果testDate是:24-Mar-2016 13:15:25

Jon*_*eet 8

Z你的输入指示UTC时间,但默认行为Convert.ToDateTime是将结果转换到本地时间.如果你看看Convert.ToDateTime("2016-03-30T17:15:25.879Z").Kind你会看到它的结果Local.

我建议使用DateTime.ParseExact,您可以在其中指定所需的确切行为,例如保留UTC时间:

var dateTime = DateTime.ParseExact(
    "2016-03-30T17:15:25.879Z",
    "yyyy-MM-dd'T'HH:mm:ss.FFF'Z'",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
Console.WriteLine(dateTime);      // March 30 2016 17:15 (...)
Console.WriteLine(dateTime.Kind); // Utc
Run Code Online (Sandbox Code Playgroud)

然后,您可以将该值转换为字符串.

当然我真的建议使用我的Noda Time项目,在那里你要解析一个Instant或者一个ZonedDateTime会知道它在UTC中... ... IMO,DateTime简直就是破了,正是由于你遇到的那种问题看到.


Son*_*nül 6

当您使用Convert.ToDateTime(DateTime.Parse内部使用)Z(这意味着祖鲁时间)时,此方法会将当前时区偏移量添加到该DateTime值.

看起来您当前的时区现在是UTC -04:00,这就是为什么方法返回4小时的结果.

我会建议使用DateTime.ParseExactAdjustToUniversalAssumeUniversal样式预防Kind作为转换乔恩回答.

AdjustToUniversal

日期和时间以协调世界时(UTC)返回.如果输入字符串表示本地时间,则通过时区说明符或AssumeLocal日期和时间从本地时间转换为UTC.如果输入字符串表示UTC时间,则通过时区说明符或AssumeUniversal不发生转换.如果输入字符串不表示本地或UTC时间,则不会发生转换,结果Kind属性为Unspecified.