【问题标题】:Datetime conversion Adding 5 hours日期时间转换 增加 5 小时
【发布时间】:2020-03-03 09:23:34
【问题描述】:

我在 c# 中的数据表中插入记录,其中日期时间的转换给 em 额外的 5 小时。

DateTime.ParseExact("2020-02-19T15:28:36.207Z", "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture);

这给了我 8:28 pm 而不是 3:28 pm 这是来自 c# 的响应

{2/19/2020 8:28:36 PM}
    Date: {2/19/2020 12:00:00 AM}
    Day: 19
    DayOfWeek: Wednesday
    DayOfYear: 50
    Hour: 20
    Kind: Local
    Millisecond: 207
    Minute: 28
    Month: 2
    Second: 36
    Ticks: 637177409162070000
    TimeOfDay: {20:28:36.2070000}
    Year: 2020```

【问题讨论】:

标签: c# date datetime


【解决方案1】:

它正在转换为当地时间。如果您将 DateTimeStyles.AdjustToUniversal 指定为最后一个参数,您最终将得到一个具有 KindUniversal 且时间为下午 3:28 的值:

var result = DateTime.ParseExact(
    "2020-02-19T15:28:36.207Z",
    "yyyy-MM-ddTHH:mm:ss.fffZ",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AdjustToUniversal);

请注意,这里的枚举值名称有点不幸,因为您并没有真正调整 - 您是说您想要调整当地时间。来自docs

如果输入字符串通过时区说明符或 AssumeUniversal 表示 UTC 时间,则不会发生转换。

【讨论】:

    【解决方案2】:

    日期时间采用 UTC 格式的 ISO 8601 格式(带有“Z”后缀)。在Roundtrip mode (DateTime.Parse("...", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind)) 中解析回来会自动正确处理:

    传递给 DateTime 和 DateTimeOffset 的 Parse、TryParse、ParseExact 和 TryParseExact 方法的字符串可以通过使用“O”或“o”格式说明符进行解析,如果它们是这些格式之一。对于 DateTime 对象,您调用的解析重载还应包含一个值为 DateTimeStyles.RoundtripKind 的样式参数。 请注意,如果您使用与“O”或“o”格式说明符对应的自定义格式字符串调用解析方法,您将不会得到与“O”或“o”相同的结果。这是因为使用自定义格式字符串的解析方法无法解析缺少时区组件或使用“Z”表示 UTC 的日期和时间值的字符串表示形式。 [我的重点]

    代码中出了什么问题:通过将“Z”指定为格式字符串中的字符,您将按字面意思匹配字符“Z”(大写“Z”不是自定义格式说明符),这会导致丢弃时区信息并根据 DateTimeStyles 参数来解释时区。可以为此选择正确的值,但更好的选择是使用已经知道如何处理此问题的往返格式模式。

    编辑:烦人的是,DateTime.ParseExact( datestr, "o", CultureInfo.InvariantCulture )(用“o”解析)不起作用,但用 DateTimeStyles.RoundtripKind 参数解析可以。感谢@SirRufo 指出这一点。

    【讨论】:

      【解决方案3】:

      您可以将日期时间格式字符串更改为 yyyy-MM-ddTHH:mm:ss.fff'Z' 并获得没有时区偏移的时间,因为 Z 格式说明符用于当前时区和 UTC 之间的偏移:

      “z”自定义格式说明符表示有符号的偏移量 来自协调世界时的本地操作系统时区 (UTC),以小时为单位。

      将其放入引号后,您将得到正确的结果

      var result = DateTime.ParseExact("2020-02-19T15:28:36.207Z", "yyyy-MM-ddTHH:mm:ss.fff'Z'", CultureInfo.InvariantCulture); //returns 2/19/2020 3:28:36 PM
      

      额外的 5 小时意味着您的操作系统时区是 UTC+5

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 2021-06-23
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多