日期字符串解析--SimpleDateFormat严格限制日期转换setLenient(false)

输入“33/12/2011”,用SimpleDateFormat parse()方法,转化为Date(2012,01,02).这样处理相当“33/12/2011”是正常输入,如果需要"33/12/2011”报错,即把"33/12/2011"当作错误格式,刚开始自己写了段逻辑判断:

把转成的日期再反转回来,再比较是否一致,即使用format方法再转换成字符串,和传入的那个串作比较,如果不相等,则证明传入的那个日期格式是错误的

    private String getDestDateStrFromSrcDateStr(String dateStr,
            String srcDateFormat, String descDateFormat)
    {
        try
        {
            final SimpleDateFormat src_sdf = new SimpleDateFormat(srcDateFormat);
            final Date date = src_sdf.parse(dateStr);
            
            //把转成的日期再反转回来,再比较是否一致
            if (srcDateFormat.length() != dateStr.length()
                    || !dateStr.equals(src_sdf.format(date)))
            {
                LOGGER.error("the src date format is {} , but input the date string value is {}, input illegal",
                        srcDateFormat,
                        dateStr);
                throw new ParseMessageException(
                        ErrorKeys.PAYMENT_AG_CONFIG_SERVICE_PARAM_VALIDATE_FAILED);
            }
            
            //把转成的date类型转换为目标格式日期字符串(yyyyMMdd)
            final SimpleDateFormat dest_sdf = new SimpleDateFormat(
                    descDateFormat);
            LOGGER.info("the converted dest date str:{}"
                    + dest_sdf.format(date));
            return dest_sdf.format(date);
        }
        catch (java.text.ParseException e)
        {
            LOGGER.error("the src date format is {} , but input the date string value is {}, input illegal",
                    srcDateFormat,
                    dateStr);
            throw new ParseMessageException(
                    ErrorKeys.PAYMENT_AG_CONFIG_SERVICE_PARAM_VALIDATE_FAILED);
        }
    }

 总觉得这种方法显得很笨拙,后来找找API,发现有一个方法:setLenient(false)可以直接使用。哎~何必费这么大劲呢

测试方法:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class DateTest {
	public static void main(String[] args) throws ParseException {
		DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
		format.setLenient(false);
		Date date = format.parse("33/12/2011");
		System.out.println(date);
	}
}

 

该方法的作用:

setLenient用于设置Calendar是否宽松解析字符串,如果为false,则严格解析;默认为true,宽松解析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值