关于c#:Parse timespan issue发表于01:00:00

Parse timespan issue on 0000-00-00.01:00:00

我在分析时间跨度时遇到问题,我有一个数据集的开始时间和结束时间,并且步骤的格式是这样的0000-00-00.01:00:00,所以在这种情况下,间隔只有一个小时。但这可能需要几天时间等,所以它必须保持一些支持。

问题是这样的一条线

1
2
const string TimeSpanFormat = @"yyyy-MM-dd\.hh\:mm\:ss";
TimeSpan.ParseExact(StepToConvert, TimeSpanFormat, CultureInfo.InvariantCulture)

或者像这样

1
DateTime.ParseExact(StepToConvert, TimeSpanFormat, CultureInfo.InvariantCulture).TimeOfDay

返回两个错误

Additional information: The DateTime represented by the string is not supported in calendar System.Globalization.GregorianCalendar.

所以我有点茫然,除了创建一个助手类/结构。在datetime btw的EDOCX1[1]这样的时间工作很好。

社区对此有什么好主意吗?


对于TimeSpan.ParseExactyyyyMM没有自定义的时间跨度格式字符串。对于一个TimeSpan来说,这些是一些有问题的主题。这只是一个时间间隔。一个月或一年的持续时间取决于很多东西。

对于DateTime.ParseExact,首先,你的0000-00-00.01:00:00DateTime.MinValue小。不能解析不作为DateTime存在的字符串。即使您的字符串是可用的DateTime值,您的字符串和格式也根本不匹配。对于像2013-01-01.00:00:00这样的字符串,您的TimeSpanFormat应该是yyyy-MM-dd.HH:mm:ss,最好是IFormatProvider:作为TimeSeparator

1
2
3
string s ="2013-01-01.00:00:00";
const string format ="yyyy-MM-dd.HH:mm:ss";
DateTime.ParseExact(s, format, CultureInfo.InvariantCulture).TimeOfDay // 00:00:00


这与日期无关,因此您可以使用"银行"方法,在30天和360天内计算月份和年份,或者最适合的方法(如果需要的话)。

然后进行自定义拆分和计算并添加片段:

1
2
3
4
5
6
7
8
9
10
11
string step ="0001-02-03.01:00:00";

string[] parts = step.Split(new string[] {"-","."}, StringSplitOptions.None);

TimeSpan hours = TimeSpan.Parse(parts[3]);
TimeSpan days = new TimeSpan(int.Parse(parts[2]), 0, 0, 0);
TimeSpan months = new TimeSpan(int.Parse(parts[1]) * 30, 0, 0, 0);
TimeSpan years = new TimeSpan(int.Parse(parts[0]) * 360, 0, 0, 0);
TimeSpan total = hours.Add(days).Add(months).Add(years);

Console.WriteLine(total.ToString());

示例的结果是423.04:00:00。