Parse timespan issue发表于01:00:00

时间:2015-06-23 07:53:09

标签: c# parsing

我在解析时间跨度时遇到问题,我有一个数据集的开始和结束时间,步骤格式如此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的时间顺便提一下。

社区中有什么好主意吗?

2 个答案:

答案 0 :(得分:4)

对于TimeSpan.ParseExactyyyyMM没有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。