【发布时间】:2020-09-22 14:13:32
【问题描述】:
关于 c# 中 DateTime.Parse 精度的快速问题?
我有多个输入文件,我将它们合并到一个行列表中,然后我将按日期时间排序。
这很好,除了当毫秒仅为 2 位时 Parse 函数似乎错误地处理日期,在下面的情况下,它将 09:57:44.84 视为 09:57:44.840 而不是 09:57:44.084
List<DateTime> lstUnOrdered = new List<DateTime>();
lstUnOrdered.Add(DateTime.Parse("04/09/2020 09:57:44.573", CultureInfo.InvariantCulture));
lstUnOrdered.Add(DateTime.Parse("04/09/2020 09:57:44.84", CultureInfo.InvariantCulture));
var Ordered = lstUnOrdered.OrderBy(x => x.TimeOfDay);
foreach (var item in Ordered)
{
Console.WriteLine(item.ToString("dd/MM/yyyy HH:mm:ss.fff"));
}
运行时会得到如下输出
09/04/2020 09:57:44.573
09/04/2020 09:57:44.840
我期待这个输出
09/04/2020 09:57:44.084
09/04/2020 09:57:44.573
对我可能出错的地方有什么建议吗?
谢谢
编辑: 基于下面的 cmets,只是一些更新:
“从根本上说:生成这些值的任何东西都已损坏,应该修复。如果这对您来说不可能,您应该在解析数据之前修补数据,在必要时插入额外的 0。”
-- 这是正确的,我无法控制数据。但我知道输入文件中的顺序是:
09/04/2020 09:57:44.84
09/04/2020 09:57:44.573
这告诉我日期应该是 084 而不是 840,我并不认为 Parse 不正确,只是寻找更精确地解析这些日期的替代方法,而不是必须先编写另一种方法来清理日期字符串。
我当然可以在 .并在需要时添加 1 或 2 个零,希望 .Net 有一种内置方法可以使用 DateTime.Parse 或替代方法来执行此操作。
谢谢
【问题讨论】:
-
为什么不能在 84 之前添加一个 0?
-
0.84与0.840相同。Parse工作正常。数学就是这样运作的 -
in the case below it treats 09:57:44.84 as 09:57:44.840 instead of 09:57:44.084这就是小数的工作方式。那不是错误。如果我要 1.1 美元,那将是 1 美元和 10 美分。不是 1 美元和 1 美分。 -
从根本上说:产生这些值的任何东西都被破坏了,应该修复。如果这对您来说不可能,您应该在解析数据之前修补数据,在必要时插入额外的 0。
-
感谢所有 cmets。我已经更新了原帖。