论坛首页 Java企业应用论坛

自己想的一个java日期验证,不用正则

浏览 6875 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (1)
作者 正文
   发表时间:2012-10-23  

自己想的一个java日期验证,不用正则表达式
可以验证多种format格式的日期
这个在我博客里面的验证类中有。有需要的朋友可以去下载。
方法:

private static final String DATE_DEFAULT_FORMAT = "yyyyMMdd";

	/**
	 * string is date
	 * 
	 * @author xieyan 2012/10/22
	 * @param str checked string
	 * @param formatStr format
	 * @return true:is date | false:is not date
	 */
	public static boolean isDate(String str, String formatStr) {
		if (isNull(str))
			return false;
				
		if (isNullOrEmpty(formatStr))
			formatStr = DATE_DEFAULT_FORMAT;
		
		if (str.length() != formatStr.length())
			return false;
		
		SimpleDateFormat format = new SimpleDateFormat(formatStr);
		try {
			return str.equals(format.format(format.parse(str)));   // 这里用equals主要是为了防止像20121032这样数据会转为20121101
		} catch (ParseException e) {
			return false;
		}
	}

 junit方法

	/**
	 * test StringUtilities.isDate
	 */
	public void testIsDate() {
		// string is 20121022
		assertTrue(StringUtilities.isDate("20121022", ""));
		// string is 20121022
		assertTrue(StringUtilities.isDate("20121022", null));
		// string is 20121022, format is yyyyMMdd
		assertTrue(StringUtilities.isDate("20121022", "yyyyMMdd"));
		// string is 2012/10/22, format is yyyy/MM/dd
		assertTrue(StringUtilities.isDate("2012/10/22", "yyyy/MM/dd"));
		// string is 2012-10-22, format is yyyy-MM-dd
		assertTrue(StringUtilities.isDate("2012-10-22", "yyyy-MM-dd"));
		// string is 20121022 11:53:00.123, format is yyyyMMdd hh:mm:ss.SSS
		assertTrue(StringUtilities.isDate("20121022 11:53:00.123", "yyyyMMdd hh:mm:ss.SSS"));
		// string is 2012122, format is yyyyMdd
		assertFalse(StringUtilities.isDate("2012132", "yyyyMdd"));
		// string is 2012/10/22, format is yyyy/MM/dd
		assertFalse(StringUtilities.isDate("20121032", "yyyy-MM-dd"));
		// string is 2012/10/22, format is yyyy/MM/dd
		assertFalse(StringUtilities.isDate("20121032", "yyyyMMdd"));
		// string is 2012122, format is yyyyMMdd
		assertFalse(StringUtilities.isDate("2012132", "yyyyMMdd"));
		// string is ""
		assertFalse(StringUtilities.isDate("", "yyyyMMdd"));
		// string is "null"
		assertFalse(StringUtilities.isDate("null", "yyyyMMdd"));
		// string is null
		assertFalse(StringUtilities.isDate(null, "yyyyMMdd"));
	}
 

有异议的朋友可以短信我。

   发表时间:2012-10-23  
performance
1 请登录后投票
   发表时间:2012-10-24  
看标题我就在猜,楼主不会是想用异常来代替正则吧,一看,果然。。。
1 请登录后投票
   发表时间:2012-10-24  
就创新这方面来说,还是好的。
0 请登录后投票
   发表时间:2012-10-24  
这不是一个新方法, 老早就有了, 甚至js都有这种方法.

大多反对此方法的观点是, 异常性能太低!!
0 请登录后投票
   发表时间:2012-10-24  
BUG或者说歧义。请楼主测试
isDate("2012-01-31", "yyyy-M-d");
另外,严重建议使用setLenient方法来替代重写format进行比较
0 请登录后投票
   发表时间:2012-10-24  
public static boolean isDate(String str, String formatStr) {
if (isNull(str))
return false;

if (isNullOrEmpty(formatStr))
formatStr = DATE_DEFAULT_FORMAT;

if (str.length() != formatStr.length())
return false;

SimpleDateFormat format = new SimpleDateFormat(formatStr);
format.setLenient(false);
try {
format.parse(str);
return true;
} catch (ParseException e) {
return false;
}
}

这个第一个人告诉我的时候,我修正了,一直没有上传,不好意思
assertFalse(StringUtilities.isDate("2012-01-31", "yyyy-M-d"));
测试的时候是绿条
0 请登录后投票
   发表时间:2012-10-24  
xieyan30 写道
public static boolean isDate(String str, String formatStr) {
if (isNull(str))
return false;

if (isNullOrEmpty(formatStr))
formatStr = DATE_DEFAULT_FORMAT;

if (str.length() != formatStr.length())
return false;

SimpleDateFormat format = new SimpleDateFormat(formatStr);
format.setLenient(false);
try {
format.parse(str);
return true;
} catch (ParseException e) {
return false;
}
}

这个第一个人告诉我的时候,我修正了,一直没有上传,不好意思
assertFalse(StringUtilities.isDate("2012-01-31", "yyyy-M-d"));
测试的时候是绿条

typo了,是2012-1-31,不过,楼主想象能力还真差
0 请登录后投票
   发表时间:2012-10-24  
为什么要做日期验证啊,现在不都是日期控件,时间是不需要验证的。
0 请登录后投票
   发表时间:2012-10-25  
很多客户要求有日期控件,但是可以手动入力
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics