从字符串创建DateTime而不应用时区或夏令时

时间:2011-05-20 15:00:28

标签: c# .net datetime timezone datetime-parsing

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

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

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

感谢。

5 个答案:

答案 0 :(得分:17)

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

DateTime clientsideProfileSyncStamp =
  DateTime.Parse(
    "20-May-2011 15:20:00",
    CultureInfo.CurrentCulture,
    DateTimeStyles.AssumeUniversal
  );

答案 1 :(得分:11)

使用

DateTimeOffset.Parse

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

答案 2 :(得分:2)

在DateTime字符串中添加Z

DateTime clientsideProfileSyncStamp = Convert.ToDateTime("20-May-2011 15:20:00Z");
Console.Write(clientsideProfileSyncStamp.ToUniversalTime()); // 20-May-2011 15:20:00

答案 3 :(得分:1)

不要忘记允许您在没有异常的情况下处理解析错误的TryParse变体

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

此外,如果您未使用ParseExactTryParseExact,则会假设输出KindLocal,因此您可能还想使用ToUniversalTime()

clientsideProfileSyncStamp.ToUniversalTime();

答案 4 :(得分:0)

DateTime.Parse()DateTime.TryParse()

var clientsideProfileSyncStamp = DateTime.Parse("20-May-2011 15:20:00");