DateTime无法以HH:mm:ss格式解析24:00:00

时间:2014-03-25 18:59:40

标签: c# datetime

在解析某些时候,我发现了一个非常有趣的错误。

DateTime无法解析24:00:00。在一些谷歌搜索和堆叠下,我发现DateTime只识别00 - 23(?????),所以如果你的输入是24:00:00,那你就不走运了。你会认为有人会把24:00:00等同于00:00:00(午夜),但还没有......

我的问题是,如何允许DateTime允许我解析24:00:00

很遗憾,我不能在规范原因下使用NodaTime(对不起Jon。我喜欢你的图书馆。)

以下实验:

input 2014-03-18 24:00:00会出现以下错误。预期

enter image description here


input 2014-03-18 23:59:59将成功解析。预期

enter image description here


2014-03-19 00:00:00的input将成功解析。预期

enter image description here

5 个答案:

答案 0 :(得分:13)

没有" 24小时"在DateTime类中支持。

The hour (HH/H, 24-hour clock) must be 0-23, inclusive。这就是为什么00:00:00有效,但不是24:00:00。

将24:00:00更改为00:00:00(解析前),如果需要,可以根据需要提前一天(解析后)。


以下内容适用于所提供格式的时间(但仅限于第24小时),尽管它没有考虑任意格式。支持不同的格式字符串只会增加额外的复杂性。

DateTime ParseWithTwentyFourthHourToNextDay (string input) {
    var wrapped = Regex.Replace(input, @"24:(\d\d:\d\d)$", "00:$1");
    var res = DateTime.ParseExact(wrapped, "yyyy-MM-dd HH:mm:ss", null);
    return wrapped != input
        ? res.AddDays(1)
        : res;
}

答案 1 :(得分:2)

24:00:00不存在。现在是00:00:00 - 23:59:59

答案 2 :(得分:1)

在解析之前,进行简单的搜索并替换 - 将'24:00:00'替换为'00:00:00',然后照常解析。

答案 3 :(得分:1)

为什么要将24:00:00解析为有效的时间表达式,就像说09:05:60一样。时间的屋顶是23:59:59.99999999999,然后转到00:00:00。

答案 4 :(得分:0)

转换为分钟。

if t.TotalMinutes < 0

double _24h = 0;
_24h = 1440 + t.TotalMinutes;
TimeSpan t = TimeSpan.FromMinutes(_24h);