我的问题有点棘手,我希望你能理解我想问的问题。
我的所有例子都使用的是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
是德语)
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
中选择所有必要的信息?
答案 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?();
}