我的问题有点棘手,希望你能理解我想问什么。
我所有的例子都使用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
是德语)
isValid = Date.TryParse("27.02.2018", New Date)
isValid = Date.TryParse("27.02.2018", CultureInfo.CurrentCulture, DateTimeStyles.None, New Date)
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?();
}