11

如何从已针对 UTC 调整的字符串创建 DateTime var?我在设置为 BST (GMT+1) 的机器上运行它。如果我运行以下代码行:

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00");

然后在针对数据库保存(UTC)值的测试中使用该值,然后看起来 Convert.ToDateTime() 实际上给了我 14:20 的 UTC 值。我不希望它进行转换 - 我只是希望它接受我的 DateTime 字符串已经在 UTC 中。

谢谢。

4

6 回答 6

19

解析字符串,并指定当字符串中没有指定时区时它应该采用 UTC 时间:

DateTime clientsideProfileSyncStamp =
  DateTime.Parse(
    "20-May-2011 15:20:00",
    CultureInfo.CurrentCulture,
    DateTimeStyles.AssumeUniversal
  );
于 2011-05-20T15:09:17.180 回答
14

利用

DateTimeOffset.Parse

广告不足的DateTimeOffset类型表示一个时间点,而与时区差异无关,因此应优先使用需要“时间戳”的 DateTime。

于 2011-05-20T15:05:01.707 回答
6

@Guffa 的答案非常好,但我想添加一个额外的答案。如果您的日期时间字符串看起来像这样“2017-11-27T05:30:00.000Z”,那么 AssumeUniversal 不起作用。尝试这个 :

    DateTime.Parse("2017-11-27T05:30:00.000Z", null, System.Globalization.DateTimeStyles.AdjustToUniversal);

AssumeUniversal 和 AdjustToUniversal 之间存在细微差别。在这里阅读:AssumeUniversal 和 AdjustToUniversal 之间的区别

于 2017-11-28T06:24:18.423 回答
2

Z在 DateTime 字符串中添加一个:

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00Z");
Console.Write(clientsideProfileSyncStamp.ToUniversalTime()); // 20-May-2011 15:20:00
于 2011-05-20T15:06:24.550 回答
2

不要忘记TryParse允许您毫无例外地处理解析错误的变体

DateTime clientsideProfileSyncStamp;
DateTime.TryParse(
    "20-May-2011 15:20:00",
    System.Globalization.CultureInfo.CurrentCulture,
    System.Globalization.DateTimeStyles.AssumeUniversal,
    out clientsideProfileSyncStamp
);

此外,如果您不使用ParseExact,或者TryParseExact它会假定输出KindLocal这样,您可能还想使用ToUniversalTime()

clientsideProfileSyncStamp.ToUniversalTime();
于 2015-07-28T05:34:07.293 回答
0

DateTime.Parse() or DateTime.TryParse()

var clientsideProfileSyncStamp = DateTime.Parse("20-May-2011 15:20:00");
于 2011-05-20T15:02:34.280 回答