从字符串中解析DateTime (c#)

4

我收到了一个来自API调用的日期数据: Wed, 6 Mar 2019 14:39:49 +0300

我需要将这个字符串解析为DateTime格式。为此,我使用以下代码:

DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                     new string[] { "ddd, dd MMM yyyy HH:mm:ss zzzz" },
                     CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

但是我得到了错误:

字符串“Wed,6 Mar 2019 14:39:49 +0300”未被识别为有效的 DateTime。

我做错了什么?我该如何解决这个问题?


1
似乎问题出在单个数字(6)与dd模式不匹配。"06"可能会起作用。 - haim770
2
“Long date format” 不适合于 API,最好使用 ISO8601 格式,它是语言无关的。如果您的代码在非英语环境中运行,则无法正确解析。如果您对 API 有任何控制权,建议您进行修复。 - Neil
1
FYI:这与您的问题不直接相关,但如果您只想使用/提供单个日期格式字符串,则不需要使用字符串数组... - user2819245
7个回答

13

我看到两个问题;

  1. 你应该使用d占位符而不是dd占位符,因为你的一位数日期没有前导零
  2. 没有zzzz作为自定义格式占位符。你应该使用zzz占位符

DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                     new string[] { "ddd, d MMM yyyy HH:mm:ss zzz" },
                     CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

But honestly, if your strings have a UTC Offset value, I would suggest parse it to DateTimeOffset instead since a DateTime instance does not have offset part and using zzz specifiers is not recomended as stated on MSDN.

With DateTime values, the "zzz" custom format specifier represents the signed offset of the local operating system's time zone from UTC, measured in hours and minutes. It does not reflect the value of an instance's DateTime.Kind property. For this reason, the "zzz" format specifier is not recommended for use with DateTime values.

To parse DateTimeOffset,

DateTimeOffset.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                           new string[] { "ddd, d MMM yyyy HH:mm:ss zzz" },
                           CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

Now you can use it's .DateTime and/or .Offset properties separately if you want.


当日期为两位数时,此操作将失败。 - haim770
@haim770,你为什么这么想?你测试过吗? - user2819245
@haim770是正确的,我刚刚检查了一下,将6替换为16就会失败。 - A. Gladkiy
1
@A.Gladkiy,它失败了,因为你需要确保你的ddd(星期几)与日期匹配。 - haim770
如果第6天是星期三,那么第16天应该是星期六,而不是星期三。这就是为什么仅更改日期值会创建一个不存在的日期。 - Soner Gönül
显示剩余2条评论

1
将日期格式从 "ddd MMM yyyy" 改为 "d MMM yyyy"。
date = DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", "ddd, d MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

1

将“ddd, dd MMM yyyy HH:mm:ss zzzz”改为“ddd,d MMM yyyy HH:mm:ss zzzz”

DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", 
                     new string[] { "ddd, d MMM yyyy HH:mm:ss zzzz" },
                     CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

1
你可能在寻找


DateTime myDate = DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300",
                                      "ddd, d MMM yyyy HH:mm:ss zzz",
                                      CultureInfo.InvariantCulture, 
                                      DateTimeStyles.AdjustToUniversal);

参考:https://dev59.com/73VC5IYBdhLWcg3wdw65#10426999 这也会帮助你。谢谢。


1
Datetime.ParseExact函数就像下面的代码一样帮助你。需要更改的一件事是,不要使用dd MMM yyyy,而是使用d MMM yyyy。
DateTime.ParseExact("Wed, 6 Mar 2019 14:39:49 +0300", "ddd, d MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

0
UTC偏移量的格式为zzz而不是zzzz,并且期望它有一个冒号(:)来分隔小时和分钟(例如+03:00)。以及dd用于月份前导零的日期,但您的日期只有一位数字。在这种情况下,请使用d

不幸的是,这并没有帮助我,因为它是第三方服务,我无法添加冒号(:)。 - A. Gladkiy
@A.Gladkiy,你可以对字符串进行一些预处理。 - Daniel A. White
@DanielA.White 实际上,zzz 标识符也可以不带 : 解析。根据维基百科的描述:“它通常以格式 ±[hh]:[mm]±[hh][mm]±[hh] 显示”。据我所知,那个冒号并不是必须的。 - Soner Gönül

0
DateTime time = Convert.ToDateTime("Wed, 6 Mar 2019 14:39:49 +0300");
string ti = time.ToString(@"ddd, dd MMM yyyy HH:mm:ss zzzz");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接