【问题标题】:Parse timespan issue on 0000-00-00.01:00:00在 0000-00-00.01:00:00 解析时间跨度问题
【发布时间】:2015-09-08 21:46:42
【问题描述】:

我在解析时间跨度时遇到问题,我有一个数据集的开始时间和结束时间,并且该步骤的格式类似于 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 之类的时间上工作正常。

社区中有什么好的想法吗?

【问题讨论】:

  • 这是 DateTime 的最小值:0001-01-01 00:00:00。看看你的约会对象。
  • 这听起来像是一个愚蠢的问题,但SpanToConvert 的类型是什么?
  • @Thomas: 好像就是第一句提到的那个字符串:0000-00-00.01:00:00
  • 为什么不从DateTime.MinValue开始?
  • @Tim 因为遗憾的是它不是我的数据集,所以我必须解决传感器返回的问题。

标签: c# parsing


【解决方案1】:

对于TimeSpan.ParseExact,没有yyyyMMcustom 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

【讨论】:

  • @Downvoter 至少愿意发表评论,这样我才能看到我可能哪里错了?
  • 我没有投反对票,但这个问题的核心问题似乎是如何成功解析 DateTime 0000-00-00.01:00:00,因为 OP 无法改变它存在且必须解释为零时间跨度的事实.我想到的唯一方法是检查它是否为0000-00-00 并将其更改为0001-01-01
  • @TimSchmelter 可能是这样。 OP在他自己的答案中提供了将0000-00-00更改为0001-01-01的过程,所以我不敢更改我的:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多