从字符串创建日期时间,而不应用时区或夏令时

本文关键字:应用 时区 夏令时 字符串 创建日期 时间 | 更新日期: 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
);

此外,如果您不使用ParseExactTryParseExact它将假定输出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)

然后,日期始终保持与字符串中定义的完全一致。