【问题标题】:TimeZoneInfo.ConvertTime method not converting the DateTime correctlyTimeZoneInfo.ConvertTime 方法未正确转换 DateTime
【发布时间】:2015-11-21 23:36:18
【问题描述】:

我有以下日期字符串:2015-11-10T23:52:18.5245011Z
当我使用 DateTime.Parse 方法解析它时,它返回 11/11/2015 10:52:18 AM 这是不正确的。

我也尝试了以下转换:

TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");
DateTime targetTimeUtcconverted = TimeZoneInfo.ConvertTime(UtcDate, est);

它仍然给出:11/11/2015 10:52:18 AM

无法弄清楚我在这里缺少什么。

【问题讨论】:

    标签: c# .net datetime timezone


    【解决方案1】:

    用途:

    DateTime.Parse(s, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind)
    

    或者:

    DateTime.Parse(s, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal)
    

    或者(最佳选择):

    DateTimeOffset.Parse(s)
    

    默认情况下,如果字符串中存在任何偏移信息,DateTime.Parse 将调整为本地时间。由于Z+00:00 相同,因此假设输入为+00:00,然后从UTC 调整为本地时区。

    如果不存在偏移信息,则返回 DateTimeUnspecified 种类。

    传递DateTimeStyles.RoundtripKind 告诉它将任何具有偏移量的值视为本地时间(如前所述),但任何包含ZUTCGMT 等的值都具有DateTimeKind.Utc

    传递DateTimeStyles.AdjustToUniversal 告诉它输出应该总是DateTimeKind.Utc,如果需要的话应该调整值。

    使用DateTimeOffset.Parse 进行解析绕过了所有这些复杂的行为,只返回一个偏移量与提供的值匹配的值。当输入字符串中存在偏移量(或Z)时,这是最好的方法。如果您需要DateTime,可以使用生成的DateTimeOffset 中的UtcDateTimeLocalDateTimeDateTime 属性。

    您提供的时区转换代码是正确的,只要Kind 是UTC。使用ConvertTimeFromUtc 会更明确,但在这种情况下这并不重要。最好的方法是使用与DateTimeOffset 值一起使用的ConvertTime 的重载。结果值将是一个DateTimeOffset,其DateTime 属性与该时区中的时间相匹配,其Offset 属性是该时区中该时间的正确偏移量。

    【讨论】:

    • 谢谢老兄!!我使用了最后一个策略DateTimeOffset.Parse(s),效果很好。
    猜你喜欢
    • 2012-08-28
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多