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

C# 分析0000-00-00.01:00:00上的时间跨度问题,c#,parsing,C#,Parsing,我在分析时间跨度时遇到问题,我有一个数据集的开始和结束时间,步骤的格式如下0000-00-00.01:00:00,因此在本例中,两个时间间隔仅一小时。但可能要等几天,所以它必须保持一些支持 问题是像这样的一行 const string TimeSpanFormat = @"yyyy-MM-dd\.hh\:mm\:ss"; TimeSpan.ParseExact(StepToConvert, TimeSpanFormat, CultureInfo.InvariantCulture) DateTi

我在分析时间跨度时遇到问题,我有一个数据集的开始和结束时间,步骤的格式如下
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
还是像这样

const string TimeSpanFormat = @"yyyy-MM-dd\.hh\:mm\:ss";
TimeSpan.ParseExact(StepToConvert, TimeSpanFormat, CultureInfo.InvariantCulture)
DateTime.ParseExact(StepToConvert, TimeSpanFormat, CultureInfo.InvariantCulture).TimeOfDay
返回两个错误

其他信息:calendar System.Globalization.GregorianCalendar中不支持由字符串表示的日期时间

所以我有点不知所措,除了制作一个助手类/结构。 对于Datetime btw,在类似于
2013-01-01.00:00:00
的时间工作正常


社区中有什么好主意吗?

对于
TimeSpan.ParseExact
,没有关于
yyyy
MM
的建议。对于
TimeSpan
,这些是一些有问题的主题。这只是一个时间间隔

对于
DateTime.ParseExact
,首先,您的
0000-00-00.01:00:00
小于。无法分析不作为
DateTime
存在的字符串。即使字符串可用
DateTime
值,字符串和格式也根本不匹配。对于类似于
2013-01-01.00:00:00
的字符串,您的
TimeSpanFormat
应该是
yyyy-MM-dd.HH:MM:ss
,最好是将
作为一个字符串


对于
TimeSpan.ParseExact
,没有用于
yyyy
MM
。对于
TimeSpan
,这些是一些有问题的主题。这只是一个时间间隔

对于
DateTime.ParseExact
,首先,您的
0000-00-00.01:00:00
小于。无法分析不作为
DateTime
存在的字符串。即使字符串可用
DateTime
值,字符串和格式也根本不匹配。对于类似于
2013-01-01.00:00:00
的字符串,您的
TimeSpanFormat
应该是
yyyy-MM-dd.HH:MM:ss
,最好是将
作为一个字符串


这与日期无关,因此您可以使用“银行”方法,计算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。

这与日期无关,因此您可以使用“银行”方法计算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。

这是DateTime的最小值:
0001-01-01 00:00
。看看你的约会。这听起来可能是个愚蠢的问题,但什么类型的
SpanToConvert
?@Thomas:似乎是第一句话中提到的字符串:
0000-00-00.01:00:00
为什么你不从
DateTime.MinValue
开始呢?@Tim因为它不是我的数据集,所以我不得不研究传感器是什么返回。这是DateTime的最小值:
0001-01-01 00:00:00
。看看你的约会。这听起来可能是个愚蠢的问题,但什么类型的
SpanToConvert
?@Thomas:似乎是第一句话中提到的字符串:
0000-00-00.01:00:00
为什么你不从
DateTime.MinValue
开始呢?@Tim因为它不是我的数据集,所以我不得不研究传感器是什么return.@Downvoter是否愿意发表评论,至少这样我就可以看出我错在哪里了?我没有投过反对票,但这个问题的核心问题似乎是如何成功解析
日期时间
0000-00-00.01:00:00
,因为OP无法改变它存在的事实,并且必须解释为零时间跨度。我想到的唯一方法是检查它是否为
0000-00-00
,并将其更改为
0001-01-01
@TimSchmelter,可能是这样。将
0000-00-00
更改为
0001-01-01
过程由OP在其自己的回答中提供,所以我不敢改变我的:)@Downvoter关心评论,至少这样我可以看出我可能错在哪里?我没有投反对票,但这个问题的核心问题似乎是如何成功解析
DateTime
0000-00-00.01:00:00
,因为OP无法改变它存在的事实,并且必须被解释为零时间跨度。我想到的唯一方法是检查它是否为
0000-00-00
,并将其更改为
0001-01-01
@TimSchmelter,可能是这样。将
0000-00-00
更改为
0001-01-01
的过程由OP在自己的回答中提供,所以我不敢更改我的:)