我在解析时间跨度时遇到问题,我有一个数据集的开始和结束时间,步骤格式如此0000-00-00.01:00:00
所以在这种情况下它只有一个小时。但它可能是几天等所以它必须保持一些支持。
问题是像这样的一行
const string TimeSpanFormat = @"yyyy-MM-dd\.hh\:mm\:ss";
TimeSpan.ParseExact(StepToConvert, TimeSpanFormat, CultureInfo.InvariantCulture)
或者像这样
DateTime.ParseExact(StepToConvert, TimeSpanFormat, CultureInfo.InvariantCulture).TimeOfDay
返回错误
其他信息:日历System.Globalization.GregorianCalendar中不支持字符串表示的DateTime。
所以我有点不知所措,除了制作一个帮助类/结构。
适用于日期时间为2013-01-01.00:00:00
的时间顺便提一下。
社区中有什么好主意吗?
答案 0 :(得分:4)
对于TimeSpan.ParseExact
,yyyy
和MM
没有custom timespan format strings。这些是TimeSpan
的一些有问题的主题。这只是一个时间间隔。 Duration of a month or year depends on a lot of stuff.
对于DateTime.ParseExact
,首先,您的0000-00-00.01:00:00
小于DateTime.MinValue
。您无法解析不存在DateTime
的字符串。即使您的字符串值DateTime
可用,您的字符串和格式也不会与匹配。对于2013-01-01.00:00:00
这样的字符串,您的TimeSpanFormat
应为yyyy-MM-dd.HH:mm:ss
,而IFormatProvider
的:
为TimeSeparator
。
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
答案 1 :(得分:0)
这与日期无关,因此您可以使用“银行”方法,计算30天和360天的月数和年数 - 或者最适合的情况(如果需要的话)。
然后进行自定义拆分和计算并添加以下部分:
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。