【问题标题】:DateTime.TryParseExact single secondDateTime.TryParseExact 单秒
【发布时间】:2016-11-11 18:19:06
【问题描述】:

我有许多不同格式的比赛时间结果(或多或少是小时、分钟、秒和毫秒的任意组合):

  • 01:22:51.15
  • 22:15.12
  • 15.0
  • 12:21
  • ...

我用一个有效格式列表来解析它们,到目前为止,所有格式都可以工作,除了一个:单秒格式,例如“5”。

出于某种原因,以下列表(包含“s”作为第一项)无法帮助我将字符串“5”解析为 DateTime,但“25”可以正常工作。

var timeString = "5";
var timeFormats = new[] { "s", "s.f", "s.ff", "ss", "ss.f", "ss.ff", "m:ss", "m:ss.f", "m:ss.ff", "mm:ss", "mm:ss.f", "mm:ss.ff", "H:mm:ss", "H:mm:ss.f", "H:mm:ss.ff", "HH:mm:ss", "HH:mm:ss.f", "HH:mm:ss.ff" };
DateTime timeValue;
DateTime.TryParseExact(timeString, timeFormats, null, DateTimeStyles.None, out timeValue);

知道为什么这不能像我预期的那样工作吗?或者有没有更简洁的方法来覆盖所有这些时间格式而不添加另一个 nuget 包......? 干杯!

【问题讨论】:

  • 我认为询问该代码当前提供的内容并不过分? “这行不通”没什么好说的。
  • 您正在使用时间跨度。这就是 TimeSpan 的用途,而不是 DateTime
  • 对不起,我的意思是 TryParseExact 确实返回 false。

标签: c# datetime tryparse


【解决方案1】:

因为格式中只有一个字符,所以它被视为the Sortable standard format,而不是带有秒的自定义格式。

要更改此设置,请在自定义格式前面加上 % 字符,如 "%s"。见"Using single custom format specifiers"

另外,如果这些是实际经过的比赛时间,TimeSpan 是比DateTime 更合适的数据结构。切换时要小心,因为并非所有格式标记在两个对象之间都是相同的。特别是,TimeSpan 使用 h 几个小时,而不是 H。见Custom TimeSpan Format Strings

【讨论】:

  • %s 成功了,谢谢。我知道 TimeSpan,但我必须将它作为 DateTime 存储在数据库中,因此将其解析为 DateTime。
  • 您不应将其作为 DateTime 存储在数据库中。相反,存储为总秒数、总毫秒数或您需要的任何精度。存储为 DateTime 使用了错误的类型,并且可能会导致错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
相关资源
最近更新 更多