如何将一个字符串解析成"yyyyMMdd Hmm"格式的日期时间?

3

我非常困扰如何解决这个问题。我尝试使用Datetime.ParseExact()来解析一个字符串。

下面是我的代码:

DateTime.ParseExact("20151210 832", "yyyyMMdd Hmm", CultureInfo.InvariantCulture);

我遇到了以下错误:

'System.FormatException'类型的未经处理的异常在mscorlib.dll中发生。附加信息:字符串无法被识别为有效的日期时间。

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

更新:

我也可以获取这样的时间:

00:01 => 1
01:00 => 1
01:10 => 10

你的更新不够清晰。能否请你添加更多关于你所添加的示例的信息? - Sergii Zhevzhyk
2个回答

5

由于 H 指定符可以是 2 位数,因此此方法尝试使用 H 指定符解析您的 83。由于不存在这样的小时数,您会收到 FormatException

对于您的情况,防止此错误的一种方法是在您的 8 前加上前导零。

var s = "20151210 832";
var result = s.Split(' ')[0] + " 0" + s.Split(' ')[1];
var dt = DateTime.ParseExact(result, "yyyyMMdd Hmm", CultureInfo.InvariantCulture);

请注意,这种方法并不适用于所有情况。例如,如果您的小时部分已经有两位数,如果您的单个分钟没有前导零等。

或者您可以为所有部分设置分隔符,但在这种情况下,您需要操纵字符串和格式。

.NET团队也建议使用这种方式


@mrjasmin,没有直接解析您字符串的格式。您需要操作您的字符串。 - Soner Gönül
@dotctor,有太多情况了。如果小时部分是两位数,如果单个分钟部分有或没有前导零...你不能只用一个格式解决所有这些问题。这就是我想说的。 - Soner Gönül
问题解释得很好,但我有一些评论:mm 表示分钟部分始终有两位数字,因此这个评论“你的单数分钟有或没有前导零”是不相关的。 “你需要操作你的字符串和格式” - 格式仅针对所有情况指定一次,而字符串操作无论如何都是必要的。 - Sergii Zhevzhyk
@SergiiZhevzhyk 你是正确的。我改变了那个句子。我想要表达的是(我感觉我不能清楚地解释自己),这是一个坏格式的“字符串”,无法解析“DateTime”(抱歉,OP,但这是真的)。例如,我们不能单独处理带有前导零或不带前导零的分钟数。如果输入类似于23,我们应该怎么想?它仅适用于小时部分,如23:00吗?它只适用于分钟部分,如00:23吗?还是作为02:03的2小时和3分钟?这是不可能知道的。这就是为什么在我看来,我们可以为特定情况生成特定的解决方案。 - Soner Gönül

0

只需在分钟之前插入一个分隔符(例如,空格),然后您就可以像这样解析它:

string example = "20151210 832";
example = example.Insert(example.Length - 2, " ");
var dateTime = DateTime.ParseExact(example, "yyyyMMdd H mm", CultureInfo.InvariantCulture);

我假设日期时间字符串总是包含指定分钟的两个数字(请查看有关自定义日期和时间格式字符串的文章)。如果我的假设是错误的,则无法解析此字符串。


正如我们所讨论的那样,即使添加空格也无法解决没有前导零的单个数字问题。例如,如果时间部分是##83(我使用#而不是空格,因为它会破坏<code>高亮显示),这将在8之前添加空格而不是之后,结果将会是 83。我责怪字符串,而不是我们 :) - Soner Gönül

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