从字符串创建日期时间,而不应用时区或夏令时
本文关键字:应用 时区 夏令时 字符串 创建日期 时间 | 更新日期: 2023-09-27 17:56:59
如何从已经针对 UTC 进行调整的字符串创建 DateTime 变量? 我在设置为 BST (GMT+1) 的机器上运行它。 如果我运行以下代码行:
DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00");
然后在针对持有 (UTC) 值的数据库进行测试时使用该值,那么看起来 Convert.ToDateTime() 实际上给了我 14:20 的 UTC 值。 我不希望它进行转换 - 我只是希望它接受我的日期时间字符串已经在 UTC 中。
谢谢。
分析字符串,并指定当字符串中未指定时区时,它应采用 UTC 时间:
DateTime clientsideProfileSyncStamp =
DateTime.Parse(
"20-May-2011 15:20:00",
CultureInfo.CurrentCulture,
DateTimeStyles.AssumeUniversal
);
使用
DateTimeOffset.Parse
宣传不足的DateTimeOffset
类型表示一个时间点,而不考虑时区差异,因此应优先使用需要"时间戳"的日期时间。
@Guffa的答案非常好,但我想添加一个额外的答案。如果您的日期时间字符串看起来像这样"2017-11-27T05:30:00.000Z",则假设通用不起作用。试试这个:
DateTime.Parse("2017-11-27T05:30:00.000Z", null, System.Globalization.DateTimeStyles.AdjustToUniversal);
AssumeUniversal 和 AdjustToUniversal 之间略有不同。在这里阅读:假设通用和调整到通用之间的区别
将Z
添加到 DateTime 字符串:
DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00Z");
Console.Write(clientsideProfileSyncStamp.ToUniversalTime()); // 20-May-2011 15:20:00
不要忘记
TryParse
变体,它允许您处理解析错误而没有异常
DateTime clientsideProfileSyncStamp;
DateTime.TryParse(
"20-May-2011 15:20:00",
System.Globalization.CultureInfo.CurrentCulture,
System.Globalization.DateTimeStyles.AssumeUniversal,
out clientsideProfileSyncStamp
);
此外,如果您不使用ParseExact
或TryParseExact
它将假定输出Kind
Local
,因此您可能还想使用ToUniversalTime()
clientsideProfileSyncStamp.ToUniversalTime();
DateTime.Parse()
或DateTime.TryParse()
var clientsideProfileSyncStamp = DateTime.Parse("20-May-2011 15:20:00");
要创建独立于区域性的日期时间,请使用:
DateTime.Parse("2022-02-15 09:30:47", CultureInfo.InvariantCulture)
然后,日期始终保持与字符串中定义的完全一致。