文/陳剛 from
www.chengang.com.cn 2005-11-04
在SWT中還沒有日期控件,所以我的日期是用文本框手工輸入的,這時就需要驗證輸入的日期是否合法。在之前我是復制很久以前寫的一段代碼,它的解決方法是分解日期字串,然后檢查,這很笨且不嚴格。正確的方案應該是利用DateFormat類來檢查,如下所示:
public final class StringUtil {
private static Calendar calendar = Calendar.getInstance();
private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
private static DateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
static {
dateFormat.setLenient(false);//這個的功能是不把1996-13-3 轉換為1997-1-3
dateTimeFormat.setLenient(false);
}
public static Date parseStringToDate(String dateStr) {
if (dateStr == null || dateStr.trim().equals(""))
return null;
dateStr = dateStr.trim();
Date date = null;
try {
if (dateStr.length() <= 10) {
date = dateFormat.parse(dateStr);
} else {
date = dateTimeFormat.parse(dateStr);
}
} catch (Exception e) {
throw new IllegalArgumentException("你輸入的日期不合法,請重新輸入");
}
return date;
}
}
這個方法的Test Case也一并給出如下:
public class TestStringUtil extends TestCase {
public void testParseStringToDate() {
{
Calendar c = Calendar.getInstance();
c.clear();
c.set(2000, 1, 3, 0, 0, 0);
Date d = StringUtil.parseStringToDate("2000-02-03");
assertEquals(c.getTime().getTime(), d.getTime());
}
{
Calendar c = Calendar.getInstance();
c.clear();
c.set(2000, 1, 3, 11, 22, 33);
Date d = StringUtil.parseStringToDate("2000-02-03 11:22:33");
assertEquals(c.getTime().getTime(), d.getTime());
}
{
Calendar c = Calendar.getInstance();
c.clear();
c.set(2000, 1, 3, 0, 0, 0);
Date d = StringUtil.parseStringToDate("2000-02-3");
assertEquals(c.getTime().getTime(), d.getTime());
}
{
Calendar c = Calendar.getInstance();
c.clear();
c.set(2000, 1, 3, 1, 2, 3);
Date d = StringUtil.parseStringToDate("2000-02-03 1:02:03");
assertEquals(c.getTime().getTime(), d.getTime());
}
{
assertNull(StringUtil.parseStringToDate(""));
assertNull(StringUtil.parseStringToDate(" "));
assertNull(StringUtil.parseStringToDate(null));
}
}
public void testParseStringToDateException() {
testParseStringToDateException("2000");
testParseStringToDateException("2000-13-03");
testParseStringToDateException("2000-02-03 51:02:03");
testParseStringToDateException("2000-02-03 01:f2:03");
testParseStringToDateException("2000-02-03 01:02");
testParseStringToDateException("2000-02-03 01:02:222");
}
private void testParseStringToDateException(String dateStr) {
try {
StringUtil.parseStringToDate(dateStr);
fail("末拋出異常");
} catch (Exception e) {
assertTrue(true);
}
}
}