【问题标题】:C# - Parsing partial dates in different formatsC# - 以不同格式解析部分日期
【发布时间】:2011-03-10 14:36:20
【问题描述】:

为了在搜索方法中使用,我想解析不同格式的部分日期。 我想让用户能够搜索日和月或月和年或日和月和年。

但更成问题的是,我想根据用户所在的国家/地区以所有可能的日期格式执行此操作。这是一个 ASP.NET 页面,我可以使用 CultureInfo,因此也可以使用 CultureInfo.DateTimeFormat。

你有什么想法,如何做这样的事情吗?我认为英国人可以搜索 16/05,而美国人可以输入 05/16,或者德国人可以使用 16.05 来查找 5 月 16 日的结果,这将是很棒的。

我认为可以使用 DateTimeFormat.ShortDatePattern。但是我怎么能用它来得到他们的日、月和年呢?

我想到了类似的用法

public void GetDateParts(string SearchStr, out int? day, out int? month, out int? year)

感谢任何可以帮助我的人。

【问题讨论】:

  • 我认为让您的用户从某个日期选择器控件中选择一个日期会更好。
  • 你的问题更大。如果输入是 2/2,那是 '2 feb' 还是 'feb 2002' ?短日期格式将无法提供帮助。
  • 不清楚您是否知道用户的首选日期格式,或者您想从输入字符串中推断出它。如果您确实知道用户的国籍(或偏好),那么您就知道这些数字的含义,您只需要解析它们。从输入字符串推断格式有点复杂...
  • @Henk:由于没有日期时间格式将年份作为单个数字,因此您的示例显然是“2 feb”。但问题仍然存在,因为有些格式有 2 位数年份,其中 '10/11' 可能是 '10 nov' 或 'sep 2011'
  • @Ronald Wildenberg,DateTimePicker 不会让您选择部分日期。

标签: c# date parsing formats


【解决方案1】:

就像你们提到的大多数人一样,我想我会选择一种带有日期选择器或下拉菜单的方法。 但对于那些对其他解决方案感兴趣的人:

我考虑了一段时间的不同格式,发现它们在大多数情况下都非常相似。所以我写了一个方法来返回更常用模式的最佳匹配版本。所以'd.m.y.' -> 'd.m.y' 或 'd/m y' -> 'd/m/y'。

public static string SimplifyDateFormat(DateTimeFormatInfo DTFI)
{
    StringBuilder SB = new StringBuilder(DTFI.ShortDatePattern.ToLower());

    SB.Replace("m y", "m/y").Replace(" 'г.'", "").Replace(" ", "").Replace("dd", "d")
    .Replace("mm", "m").Replace("yyyy", "y").Replace("yy", "y");

    if (SB[SB.Length - 1] == '.') SB.Remove(SB.Length - 1, 1);
    return SB.ToString();
}

这将可能的格式数量从 26 种减少到这 8 种:

  • d/m/y
  • d.m.y
  • d-m-y
  • 年/月/日
  • y.m.d
  • y-m-d
  • 月/日/年
  • m.d.y

如果您使用 [/.-] 作为分隔符,这些只是通过正则表达式解析的 3 种不同格式。

附:仍然不能解决部分日期的问题。但是可以搜索所有文化的完整日期。

【讨论】:

    【解决方案2】:

    您可以定义多种输入格式,然后将其中一种(基于用户信息)强加到您的表单中。类似的东西:

    “输入日期(DD-MM):_ - _”代表英国

    “输入日期(MM-DD):_ - _”对于美国人

    等等……

    【讨论】:

      猜你喜欢
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多