在解析某些时候,我发现了一个非常有趣的错误。
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
会出现以下错误。预期
input
2014-03-18 23:59:59
将成功解析。预期
2014-03-19 00:00:00的input
将成功解析。预期
答案 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);