我正在尝试使用DateTime.TryParse()
方法验证从app.config文件读取的日期。但是,当输入为"12/05/201"
时,它返回true。这实际上是一个错字,应该是"12/05/2018"
。当我单步执行代码时,它会自动将日期转换为"12/05/0201"
并返回true。但是,当我使用DateTime.TryParseExact()
时,上述输入正确返回了false。因此,我们应该始终使用DateTime.TryParseExact()
吗?我有点困惑,因为早先我必须验证日期字符串时就使用DateTime.TryParse()
!这两个代码如下:
Boolean isValidStartDate = DateTime.TryParse(startDate, out DateTime startDateVerified);
CultureInfo enUS = new CultureInfo("en-US");
Boolean isValidStartDate = DateTime.TryParseExact(startDate,"MM/dd/yyyy",enUS, DateTimeStyles.None, out DateTime startDateVerified);
谢谢
答案 0 :(得分:0)
验证日期的最佳方法取决于用例和输入数据源及其格式
DateTime.TryParse是使用当前DateTimeFormatInfo对象中的格式信息进行解析的,因此,假设您使用TryParse“ 12/05/201”,它将根据您当前的区域性设置返回解析的数据。这是“ 12/05/0201”,即日期格式为“ MM / DD / YYYY”
在解析日期时指定日期格式和文化差异始终是一个好习惯,并使用TryParseExact代替TryParse
(注意:要了解当前的区域性设置,您可以查找CultureInfo.DefaultThreadCurrentCulture和CultureInfo.DefaultThreadCurrentUICulture类的成员)
答案 1 :(得分:0)
201年无效是业务逻辑-如果您希望对导入的数据进行逻辑保护(并且应该这样做),请明确进行保护。使用C#,您可以根据需要轻松地向DateTime添加扩展方法,例如
public static DateTime ParseDateWithSanity(this DateTime, string date)
{
dt = DateTime.Parse(date);
if dt.Year < 1900
{
throw BadInputException()
}
}