【问题标题】:How to convert string Date to DateTime when you are selecting record through LINQ?通过LINQ选择记录时如何将字符串日期转换为日期时间?
【发布时间】:2018-03-06 13:42:29
【问题描述】:

我有一个表,其中包含用户在系统上执行的操作的完整历史记录。我需要以datedescending 的顺序检索所有这些记录。问题是我在表格中保存了date 格式为string,因为我的应用程序支持多文化。我不知道这是个好主意还是坏主意,现在我需要按日期descending 顺序检索它们。所以,当我检索数据时,我试图将date 转换为DateTime 格式,但我遇到了invalid date format 的异常。在我的数据库中,日期为dd-MM-yyyy 格式。以下是我的查询:

db.Histories.ToList.OrderByDescending(x=> Convert.ToDateTime(x.Date));

【问题讨论】:

  • 我会修复数据库。将日期存储为数据库中的某种日期(想想datedatetime)表示。这使得它可以针对任何地区进行格式化,可以处理时区,并且可以正确排序,而无需将字符串转换为日期以及随之而来的所有麻烦。
  • 这是最好的解决方案。但是,目前有什么办法可以解决这个问题吗?
  • 如果您从中得到“无效的日期格式”,那是因为 .NET 不知道如何解析数据库中日期的格式。您可能需要使用DateTime.ParseExact 告诉.NET 如何处理它。
  • 每当我读到 “在我的数据库中,日期是 XY 格式” 我都会哭。为什么不在数据库中使用datedatetime
  • 即使使用ParseExact,我也会高度鼓励您尽快在数据库中实施合理的日期处理。您可能会花费更多时间来支持字符串日期,然后在表中创建一个单独的日期时间列,创建一个补丁 SQL 脚本来迁移数据并删除字符串列。这样就完成了,您无需花时间破解日期解析。

标签: list entity-framework linq date-conversion


【解决方案1】:

您的数据似乎并非所有有效的日期时间格式。 我认为你必须先清理数据。 或者你可以这样排序:

    var tmp = array.OrderByDescending(x => ParseDate(x.DateTest));


    private static DateTime ParseDate(string dateString)
    {
        var dateFormats = new[]
            {"dd-MM-yyyy", "dd/MM/yyyy", "M/d/yyyy", "d.M.yyyy", "dd.MM.yyyy", "MM/dd/yyyy", "M/d/yyyy"};
        try
        {
            return DateTime.ParseExact(dateString, dateFormats, CultureInfo.CurrentCulture,
                DateTimeStyles.None);
        }
        catch (Exception ex)
        {
            return DateTime.Now.AddYears(-500);
        }
    }

无效的日期时间字符串将在排序列表中最后结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多