【问题标题】:Converting string in yyyy-MM-ddTHH:mm:ss zzz format to DateTime将 yyyy-MM-ddTHH:mm:ss zzz 格式的字符串转换为 DateTime
【发布时间】:2016-04-18 16:30:48
【问题描述】:

我从 Web 服务接收 JSON 日期时间,格式如下

yyyy-MM-ddTHH:mm:ss zzz

例如:

2016-04-18T15:09:21 01:00

但是,我无法将其转换为 DateTime 对象。我尝试了以下方法:

var date = DateTime.ParseExact("2016-04-18T15:09:21 01:00", "yyyy-MM-ddTHH:mm:ss zzz", CultureInfo.InvariantCulture);

var date2 = DateTimeOffset.ParseExact("2016-04-18T15:09:21 01:00", "yyyy-MM-ddTHH:mm:ss zzz", CultureInfo.InvariantCulture);

这两行都抛出 System.FormatException 异常并显示以下消息:

字符串未被识别为有效的日期时间。

如何将2016-04-18T15:09:21 01:00 解析为 DateTime 对象?

【问题讨论】:

    标签: c# json date datetime


    【解决方案1】:

    不幸的是,“zzz”希望在时区上有一个标志。

    这会奏效。

    var date = DateTime.ParseExact("2016-04-18T15:09:21 +01:00", "yyyy-MM-ddTHH:mm:ss zzz",System.Globalization.CultureInfo.InvariantCulture);
    date.Dump();
    

    所以添加一个加号。

    var dt="2016-04-18T15:09:21 01:00";
    dt.Insert(20,"+").Dump();
    

    【讨论】:

    • 实际上,一个 +... 或一个 - 当然取决于所需的时区
    【解决方案2】:

    Dmitriy 有正确的答案,来自 The "zzz" custom format specifier 文档;

    偏移量总是以前导符号显示。加号 (+) 表示早于 UTC 小时,减号 (-) 表示小时 在UTC之后。一位数的偏移量使用前导零进行格式化。

    如果您的字符串总是采用yyyy-MM-ddTHH:mm:ss HH:mm 格式,如果您想将其解析为DateTimeOffset,则必须对其进行操作。

    我建议你用空格分割你的字符串,在这些字符串上调用 DateTime.ParseTimeSpan.Parse 并在 DateTimeOffset(DateTime, TimeSpan) constructor 中使用这些值;

    使用DateTimeOffset结构初始化一个新实例 指定DateTime 值和offset

    var str = "2016-04-18T15:09:21 01:00";
    var parts = str.Split(' ');
    var date = DateTime.Parse(parts[0]);
    var offset = TimeSpan.Parse(parts[1]);
    var dto = new DateTimeOffset(date, offset);
    

    现在你有一个DateTimeOffset 作为{18.04.2016 15:09:21 +01:00},你可以使用它的DateTimeLocalDateTimeUtcDateTime 属性,任何你想要的。

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      相关资源
      最近更新 更多