DateTime.ToString()不转换时间

时间:2016-04-01 13:44:06

标签: c# .net datetime type-conversion

看起来转换期间时间会自动更改。 我的输入是output[fullArrayCount] = new char[keysize]; 。但是,它会转换为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); 获得的结果是:testDate

3 个答案:

答案 0 :(得分: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

然后,您可以根据需要将该值转换为字符串。

当然,我确实建议使用我的Noda Time项目,而您要解析Instant或{{1}在UTC中知道它... IMO,DateTime is simply broken,正是由于你一直看到的那种问题。

答案 1 :(得分:6)

当您使用Convert.ToDateTime(内部使用DateTime.ParseZ(意味着Zulu time)时,此方法会将您当前的时区偏移量添加到该DateTime值。

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

我建议将DateTime.ParseExactAdjustToUniversalAssumeUniversal个样式一起用于阻止Kind转换为Jon answered

来自AdjustToUniversal

  

日期和时间以协调世界时(UTC)的形式返回。如果   输入字符串表示通过时区说明符的本地时间   或AssumeLocal,日期和时间从当地时间转换为   世界标准时间。 如果输入字符串表示UTC时间,则表示时区   说明符或AssumeUniversal,不发生转换。如果输入   string不表示本地或UTC时间,不发生转换   生成的Kind属性为Unspecified

答案 2 :(得分:0)

由于CultureInfo.InvariantCulture。 您要在GMT中转换日期

trainers

然后你将它转换为不变文化中的字符串

display

您应该使用DateTime.ParseExact,然后在转换中使用不变文化。