分析0000-00-00.01:00:00上的时间跨度问题
本文关键字:时间跨度 问题 0000-00-00 分析 | 更新日期: 2023-09-27 17:59:10
我在解析时间跨度时遇到问题,我有一个数据集的开始和结束时间,步骤的格式类似于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
返回错误
附加信息:日历系统不支持由字符串表示的DateTime。全球化GregorianCalendar。
所以我有点不知所措,除了制作一个helper类/结构。适用于Datetime btw.的2013-01-01.00:00:00
等时间
社区里对此有什么好主意吗?
对于TimeSpan.ParseExact
,yyyy
和MM
没有自定义的时间跨度格式字符串。这些是TimeSpan
的一些问题主题。这只是一个时间间隔。一个月或一年的持续时间取决于很多因素。
对于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
这与日期无关,因此您可以使用"bank"方法计算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。