仅使用特定文化解析字符串

时间:2018-03-06 10:01:52

标签: .net

我的问题有点棘手,我希望你能理解我想问的问题。

我的所有例子都使用的是2018年2月27日。

在德国,他们将此日期写为27.02.2018或27.2.2018。

在英国,他们将此日期写为27/02/2018或27/2/2018。

在美国,他们将此日期写为2/27/2018或02/27/2018。

此日期的ISO标准是2018-02-27。

在我们的软件中,用户可以在字符串字段中输入日期,我想检查用户输入的字符串是否为有效日期,但仅限于本地文化。 所以在德国只有27.02.2018或27.2.2018是有效的参赛作品,仅在美国 2/27/2018或02/27/2018是有效的条目。

为了做到这一点,我尝试了几种方法(CurrentCulture是德语)

  1. isValid = Date.TryParse("27.02.2018", New Date)
  2. isValid = Date.TryParse("27.02.2018", CultureInfo.CurrentCulture, DateTimeStyles.None, New Date)
  3. isValid = Date.TryParseExact("27.02.2018", "d.M.yyyy", CultureInfo.CurrentCulture, DateTimeStyles.None, New Date)
  4. 第一种和第二种方式有效,但当用户输入2018-02-27时,它们也会识别日期。 第三种方式按我想要的方式工作,但仅在用户输入德语格式化日期时才有效。如果用户在美国客户端上工作并输入美国格式的日期,则第三种方式将失败,因为第二个参数是特定于文化的。

    那么,如何才能将字符串解析为当地文化和当地文化的日期呢?是否有内置的.NET方式,或者我是否必须自己编写解析器,从CultureInfo中选择所有必要的信息?

1 个答案:

答案 0 :(得分:1)

我认为"d/M/yyyy"是你想要的,因为/被当前文化的日期分隔符取代。阅读:Custom date and time format strings: the "/" custom format specifier

public static DateTime? TryParseLocalShortDate(string dtString)
{
    if (string.IsNullOrWhiteSpace(dtString))
        return null;
    bool isValid = DateTime.TryParseExact(dtString, "d/M/yyyy", CultureInfo.CurrentCulture, DateTimeStyles.None, out DateTime dt);
    return isValid ? dt : new DateTime?();
}

您的样本:

DateTime? dt1 = TryParseLocalShortDate("27.02.2018"); // 27.02.2018
DateTime? dt2 = TryParseLocalShortDate("2018-02-27"); // null
  

不幸的是,d / M / yyyy正在认识" 27.02.2018"和" 27/02/208"如   德国文化中的有效日期

然后你可以使用更严格的DateTimeFormat.ShortDatePattern来使用这种方法:

public static DateTime? TryParseLocalShortDate(string dtString)
{
    if (string.IsNullOrWhiteSpace(dtString))
        return null;
    string format = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
    bool isValid = DateTime.TryParseExact(dtString, format, CultureInfo.CurrentCulture, DateTimeStyles.None, out DateTime dt);
    return isValid ? dt : new DateTime?();
}