SimpleDateFormat问题随记

以下内容仅做记录。

import java.text.ParseException;

public class TestFormat {
    
    /**
     * 是否有效的日期
     *
     * @param dateStr
     * @param pattern
     * @return
     */
    public static boolean isValidDate(String dateStr, String pattern) {
        java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(pattern);
        try {
            df.setLenient(false);
            df.parse(dateStr);
            return true;
        } catch (ParseException e) {
            return false;

        }
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
//        System.out.println("19810331 is valid? " + isValidDate("19810331", "yyyyMMdd"));
//        System.out.println("19810332 is valid? " + isValidDate("19810332", "yyyyMMdd"));
        System.out.println("12112200004 is valid? " + isValidDate("12112200004", "MMddHHmmss"));
        System.out.println("1020130003 is valid? " + isValidDate("1020130003", "MMddHHmmss"));
    }
    
}

这里的问题好奇怪,
System.out.println("12112200004 is valid? " + isValidDate("12112200004", "MMddHHmmss")); 这句话竟然返回TRUE。。。

没想明白,暂时只做记录。


关于如何判断一个字符串是否是给定格式的日期,现在用以下方式判断:

public static ThreadLocal<DateFormat> dateFormatThreadLocal = new ThreadLocal<DateFormat>(){
	    protected DateFormat initialValue() {
            return new SimpleDateFormat("MMddHHmmss");
        }
	};

/** 
	 * Method Name: isValidDate <br>
	 * Description: 检查日期格式是否正确 <br> 
	 * @param  value 传入的日期字符串
	 * @param  errMsg 传入的错误信息
	 * @return 
	 * @since JDK 1.6
	 */
	public static void isValidDate(String value ,String errMsg) throws AppBizException{
	    if (!StringUtil.isBlank(value)) {
	        try {
	            Date date = dateFormatThreadLocal.get().parse(value);
	            if (!value.equals(dateFormatThreadLocal.get().format(date))) {
	                throw new AppBizException(SdkAppExcCodes.VALIDATE_ERR_INVALID_FORMAT, errMsg);
                }
	        } catch (ParseException e) {
	            throw new AppBizException(SdkAppExcCodes.VALIDATE_ERR_INVALID_FORMAT, errMsg);
	        }
        }
	}

因为需要考虑多线程的同步问题,所以用了threadlocal。

猜你喜欢

转载自blog.csdn.net/hbyzzdw/article/details/51451504