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在自己的回答中提供,所以我不敢更改我的:)