【问题标题】:c# DateTime.Parse precision Issuec# DateTime.Parse 精度问题
【发布时间】: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.840.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。我已经更新了原帖。

标签: c# datetime


【解决方案1】:

只是一个更新,如果有人想知道,这将解决错误输入字符串的问题:

static void Main(string[] args)
    {
        List<DateTime> lstUnOrdered = new List<DateTime>();

        lstUnOrdered.Add(DateTime.Parse(MakeCorrectDate("04/09/2020 09:57:44.573"), 
 CultureInfo.InvariantCulture));
        lstUnOrdered.Add(DateTime.Parse(MakeCorrectDate("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"));
        }
    }

    private static string MakeCorrectDate(string strDate)
    {
        string[] milli = strDate.Split('.');

        return milli[0] + "." + milli[1].PadLeft(3, '0');
    }

【讨论】:

  • 请不要称之为错误的输入字符串
  • 为什么不呢?有一个日志文件输出:“04/09/2020 09:57:44.84”,而实际上记录的时间是“04/09/2020 09:57:44.084”,这使得输入字符串来自我的观点不好,需要更正[填充到小数点后 3 位]
  • 您是否100% 确定 .84 表示 0.084 而不是 0.840?
  • 是的,100% 确定。
猜你喜欢
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多