[英]Datetime conversion Adding 5 hours
我在 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```
它正在转换为当地时间。 如果指定DateTimeStyles.AdjustToUniversal
作为最后一个参数,你会用一个值最终Kind
的Universal
和下午3:28的时间:
var result = DateTime.ParseExact(
"2020-02-19T15:28:36.207Z",
"yyyy-MM-ddTHH:mm:ss.fffZ",
CultureInfo.InvariantCulture,
DateTimeStyles.AdjustToUniversal);
注意,枚举值的名称有点不幸在这里,因为你没有真正调整-你说你不想调整为本地时间。 从文档:
如果输入字符串通过时区说明符或 AssumeUniversal 表示 UTC 时间,则不会发生转换。
日期时间采用 UTC 格式的 ISO 8601(带有“Z”后缀)。 在往返模式下解析它( 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 指出这一点。
您可以将日期时间格式字符串更改为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.