在C#中验证日期字符串的最佳方法

时间:2018-12-13 20:59:22

标签: c#

我正在尝试使用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);

谢谢

2 个答案:

答案 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()
    }
}