仅使用特定区域性分析迄今为止的字符串



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

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

在德国,他们把这个日期写成27.02.2018或27.2.2018。

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

在美国,他们将这个日期写为 2018 年 27 月 27 日或 2018 年 2 月 27 日。

此日期的 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)

第一种和第二种方式工作,但它们也识别一个日期,当用户进入 2018-02-27 时。 第三种方式按照我想要的方式工作,但仅当用户输入德语格式的日期时。如果用户在美国客户端上工作并输入美国格式的日期,则第三种方法将失败,因为第二个参数是特定于区域性的。

那么,如何将字符串解析为本地区域性和仅本地区域的日期呢?是否有内置的 .NET 方法,或者我是否必须自己编写解析器,从CultureInfo中选择所有必要的信息?

我认为"d/M/yyyy"是你想要的,因为/被当前文化的日期分隔符所取代。读取:自定义日期和时间格式字符串:"/"自定义格式说明符

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/2018"识别为 德国文化中的有效日期

然后,您可以使用更严格的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?();
}

最新更新