尝试将日期/时间从字符串转换为DateTime时,我没有得到正确的值。
DateTime testDate = DateTime.ParseExact("2012-08-10T00:51:14.146Z", "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
我的结果是2012-08-09 8:51:14 PM。为什么它会被偏移?我只想让它与输入的值相同。
你正在解析 UTC 日期,但 DateTime.Kind 属性是本地时间。 你应该使用 DateTimeStyles.AdjustToUniversal 以将 Kind 属性标记为 Utc。
DateTime testDate = DateTime.ParseExact("2012-08-10T00:51:14.146Z", "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);
Trace.WriteLine(testDate); // 8/9/2012 8:51:14 PM
Trace.WriteLine(testDate.ToString()); // 8/9/2012 8:51:14 PM
Trace.WriteLine(testDate.ToUniversalTime()); // 8/10/2012 12:51:14 AM
Trace.WriteLine(testDate.Kind); // Local
testDate = DateTime.ParseExact("2012-08-10T00:51:14.146Z", "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
Trace.WriteLine(testDate);// 8/10/2012 12:51:14 AM
Trace.WriteLine(testDate.ToString());// 8/10/2012 12:51:14 AM
Trace.WriteLine(testDate.ToUniversalTime());// 8/10/2012 12:51:14 AM
Trace.WriteLine(testDate.Kind); // Utc
DateTime
存储,这是因为 DateTimeStyles.AssumeUniversal
仅指定输入字符串是UTC字符串。在C#中,默认情况下,将创建 DateTime
作为DateTimeKind.Local
。另一个答案中指出了这一点。这意味着将时间从UTC转换为本地时间。DateTime
,您需要使用 DateTimeStyles.AdjustToUniversal
的 DateTimeStyles
。其他答案中也提到了这一点。但是,如果您的输入字符串没有明显的时区,则可能被认为是本地时间,然后从本地时间转换为UTC。DateTime testDate = DateTime.ParseExact("2012-08-10T00:51:14.146Z", "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal
working! And testDate.Date.Kind
is also good -> DateTimeKind.Utc
- marbel82DateTime
已经是通用时间,而 AdjustToUniversal 枚举选项将把输入转换为本地时间,但结果的 Kind 为 DateTimeKind.Unspecified
。如果你使用AssumeUniversal
,你的服务器时区将会被转换为UTC时间。那么你的服务器时区可能是东部标准时间(EST)。
.AssumeLocal
而不是.AssumeUniversal
。.AssumeUniversal
,你正在指示解析器将时间戳视为UTC时间戳,因此当你使用本地时区显示它时,它会自动偏移相应的数量。
编辑:
一个重要的事情:时间戳中的大写字母“Z”表明它是一个UTC时间戳,这意味着你确实想将其视为通用时间。如果你想将其视为本地时间戳,则应从时间戳和相应的解析字符串中删除“Z”。