DateTime字符串是否包含ToShortDateString的值错误格式?

时间:2014-10-02 14:04:18

标签: c# asp.net-mvc linq entity-framework linq-to-sql

背景:我正在尝试实现搜索功能。我的搜索功能的一部分是搜索日期的能力(德语格式)。你应该可以进入" 2014"然后您将2014年的每个日期作为年份,或以德语格式输入整个日期(21.03.2014)。

不幸的是我的代码不起作用:

_unitOfWork.StammdatenRepository.Get()
           .Where(s => (s.MyDate.HasValue 
                       && s.MyDate.Value.ToShortDateString().Contains(keyword)));

如果'2014''2012'等是我的关键字,则可行。如果我输入德语格式的整个日期,我就不会得到任何结果。我认为这是因为"错误"格式ToShortDateString方法返回。

更新1: 对于迟到的回复/更新,我很抱歉。直到今天仍然无法访问代码。 if / else结构不起作用,因为我的原始代码更复杂(它是实体框架的复杂WHERE条件)。用户可以输入关键字,我在该关键字的不同列中查找。一个库存是" BeginnVos",我的日期栏:

string keyword = inputModel.Keyword.ToLower();
stammdatenEntityModels =
    _unitOfWork.StammdatenRepository.Get()
                .Where(
                    s =>
                    s.Geloescht == false &&
                    ((s.Auftraggeber != null && s.Auftraggeber.Bezeichnung.ToLower().Contains(keyword)) ||
                    (s.SerienNummer.Contains(keyword)) ||
                    (s.Bezeichnung.ToLower().Contains(keyword)) ||
                    (s.StammdatenKunde != null && s.StammdatenKunde.Name.ToLower().Contains(keyword)) ||
                    (s.BeginnVos.HasValue && s.BeginnVos.Value.ToShortDateString().Contains(keyword)) ||
                    (s.VosDauer != null && s.VosDauer.Bezeichnung.ToLower().Contains(keyword)) ||
                    (s.Geraetewert.HasValue && s.Geraetewert.Value.ToString().Contains(keyword))
                    ))
                .OrderBy(orderBy)
                .Skip(inputModel.EntriesToDisplay*(inputModel.Page - 1))
                .Take(inputModel.EntriesToDisplay)
                .ToList();

我尝试了不同的方法,即使是

s.BeginnVos.Value.ToString("dd.MM.yyyy").Contains(keyword))

但我仍然没有得到合适的结果(列表为空)。

用户输入" 22.02.2013" (德语格式)但在我的数据库中,它当然以sql日期格式存储:2013-02-22 00:00:00.000。是否需要转换用户输入?

我的解决方案,感谢Habibi:

string keyword = inputModel.Keyword.ToLower();
DateTime dateTime = new DateTime();
DateTime.TryParseExact(keyword, "d'.'M'.'yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateTime);

stammdatenEntityModels =
    _unitOfWork.StammdatenRepository.Get()
                .Where(
                    s =>
                    s.Geloescht == false &&
                    ((s.Auftraggeber != null && s.Auftraggeber.Bezeichnung.ToLower().Contains(keyword)) ||
                    (s.SerienNummer.Contains(keyword)) ||
                    (s.Bezeichnung.ToLower().Contains(keyword)) ||
                    (s.StammdatenKunde != null && s.StammdatenKunde.Name.ToLower().Contains(keyword)) ||
                    (s.BeginnVos.HasValue && s.BeginnVos == dateTime) ||
                    (s.VosDauer != null && s.VosDauer.Bezeichnung.ToLower().Contains(keyword)) ||
                    (s.Geraetewert.HasValue && s.Geraetewert.Value.ToString().Contains(keyword))
                    ))
                .OrderBy(orderBy)
                .Skip(inputModel.EntriesToDisplay*(inputModel.Page - 1))
                .Take(inputModel.EntriesToDisplay)
                .ToList();

3 个答案:

答案 0 :(得分:0)

来自MSDN

  

ToShortDateString方法返回的字符串是   的文化敏感即可。它反映了当前定义的模式   culture的DateTimeFormatInfo 对象。例如,对于en-US   文化,标准的短日期模式是" M / d / yyyy&#34 ;;为de-DE   文化,它是" dd.MM.yyyy&#34 ;;对于ja-JP文化,它是" yyyy / M / d"。   特定计算机上的特定格式字符串也可以是   定制,使其不同于标准的短日期格式   字符串。

因此,如果您想严格使用德语格式的关键字,则可以使用显式格式s.MyDate.Value.ToString("dd.MM.yyyy").Contains(keyword)

答案 1 :(得分:0)

您确定要设置正确的文化吗?

来自DateTime.ToShortDateString

  

ToShortDateString方法返回的字符串是区分文化的。它反映了当前文化的DateTimeFormatInfo对象定义的模式。例如,对于en-US文化,标准的短日期模式是“M / d / yyyy”;对于de-DE文化,它是“dd.MM.yyyy”;对于ja-JP文化,它是“yyyy / M / d”。特定计算机上的特定格式字符串也可以自定义,以便它与标准的短日期格式字符串不同。

如果您未将文化设置为de-DE,则ToShortDateString将返回使用en-US区域设置格式化的日期(即09/30/2014而不是30.09.2014

答案 2 :(得分:0)

我认为使用字符串表示法比较日期的逻辑是错误的。相反,您应该将关键字转换为DateTime类型对象,然后比较DateTime个对象。像:

string keyword = "2014";
DateTime parsedDate;
if (DateTime.TryParseExact(keyword, "yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate))
{
    // only year provided
    //Compare only year part
    unitOfWork.StammdatenRepository.Get()
               .Where(s => (s.MyDate.HasValue
                      && s.MyDate.Value.Year == parsedDate.Year));
}
else if (DateTime.TryParseExact(keyword, "d.M.yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedDate))
{
    //Complete date provided
    //compare complete date
    unitOfWork.StammdatenRepository.Get()
                .Where(s => (s.MyDate.HasValue
                          && s.MyDate.Value.Date == parsedDate.Date));
}
else
{
    //invalid keyword
}

您可能遇到的另一个问题是,如果您的LINQ查询是针对数据提供程序(例如Entity框架)执行的,那么您最终可能会遇到ToShortDateString不受支持的异常。因为ORM会将LINQ查询转换为谎言数据源语言,(在SQL Server的情况下可能是SQL)

您可以使用多种格式。 (注意格式为d的单Md.M.yyyy,对于单/双位日/月部分来说已经足够了,如果那不是要求那么你可以使用dd.MM.yyyy格式)