分析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等时间

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

分析0000-00-00.01:00:00上的时间跨度问题

对于TimeSpan.ParseExactyyyyMM没有自定义的时间跨度格式字符串。这些是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。