小巧实用日期处理 - DateUtil

    主要由下面四部分组成

    我们先来看出镜率最高的两个转换的方法 DateUtil.toString(Date, String) , DateUtil.toDate(String, String…)

    这就是我们常用来做 Date类型转成字符串类型的方法通常我们会这么写

    如果有小伙伴不小心把 simpleDateFormat 声明成类的变量,在并发的情况下,可能会出现异常,参见 SimpleDateFormat在多线程下不安全 此时你可以直接使用:

    示例:

    1. DateUtil.toString(Tue Oct 16 23:49:21 CST 2012,DatePattern.COMMON_DATE_AND_TIME_WITH_MILLISECOND)

    结果:

    1. 2012-10-16 23:49:21.525

    此外,也经常看到小伙伴是这样创建时间戳文件夹的

    1. Calendar calendar = Calendar.getInstance();
    2. String userDefinedPath = calendar.get(Calendar.YEAR) + "/"
    3. + (calendar.get(Calendar.MONTH) + 1) + "/"
    4. + calendar.get(Calendar.DAY_OF_MONTH) + "/" + "propertyImage"
    5. + "/";

    可以看到,代码更加简洁明了

    2.DateUtil.toDate(String, String…) 方法

    DateUtil.toString(Date, String) 相反的,就是将字符串转成 Date 格式

    将时间字符串 dateString 使用一个或者多个不同的 datePattern 模式按照顺序转换成date类型. 经常我们会看到小伙伴写出下面的代码:

    1. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    2. Date publishTimeDate = null;
    3. try{
    4. publishTimeDate = simpleDateFormat.parse(publishTime);
    5. }catch (ParseException e1){
    6. e1.printStackTrace();
    7. }

    可以看到直接使用 SimpleDateFormat 来写代码的话, 代码行数较多,并且还需要自行处理 ParseException checkedException异常, 而且catch里面一般都是写的都是无用代码此时你可以一行代码搞定:

    1. Date publishTimeDate = DateUtil.toDate(publishTime, DatePattern.COMMON_DATE_AND_TIME_WITHOUT_SECOND);

    该方法,如果转换有异常,会将 ParseException 转成 IllegalArgumentException 返回,是 UnCheckedException异常 ,非强行要求捕获处理

    示例:

    1. DateUtil.toDate("2016-02-33", DatePattern.COMMON_DATE) = 2016-03-04
    2. DateUtil.toDate("2016-06-28T01:21:12-0800", "yyyy-MM-dd'T'HH:mm:ssZ") = 2016-06-28 17:21:12
    3. DateUtil.toDate("2016-06-28T01:21:12+0800", "yyyy-MM-dd'T'HH:mm:ssZ") = 2016-06-28 01:21:12

    注意:

    • 转换的时候,使用日历的宽松模式,参见 java.text.DateFormat.setLenient(boolean),即支持传入"2016-02-33",会转换成 2016-03-04
    • 如果能解析所有的字符串,那么视为成功
    • 如果没有任何的模式匹配,将会抛出异常下面出场的是经常会用作报表数据统计的方法获得 今天00:00:00,这个月第一天,这个星期第一天,今年第一天

    4. 时间运算

    聪明程序员 是这么写的

    1. /**
    2. * @return
    3. */
    4. private Date[] getTimes(){
    5. Date start = new Date();
    6. Date[] dates = { start, DateUtil.getFirstDateOfThisDay(DateUtil.addMonth(start, 1)) };
    7. return dates;
    8. }

    4.2 实例2 导出数据

    程序员鼓励师:小帅哥,帮我导出7天以来的订阅邮件数据

    普通程序员 是这么写的:

    1. /* 获取上一周的数据 */
    2. java.util.Calendar c = java.util.Calendar.getInstance();
    3. c.add(java.util.Calendar.DAY_OF_WEEK, -7);
    4. Date startDate = c.getTime();
    5. Date curDate = new Date();

    细细一琢磨,这段代码如果执行的话,如果系统较卡,执行到这段代码的时候,会有数据丢失

    聪明程序员 是这么写的

    1. /* 获取上一周的数据 */
    2. Date startDate =DateUtil.getFirstDateOfThisDay(DateUtil.addDay(new Date(), -7));
    3. Date curDate = new Date();

    6. 时间比较

    判断指定年 year 是否为闰年

    8. 综合运用:

    下面代码 美化

    美化后:

    1. // 判断是否支持当日达和COD
    2. private void judgeDelivery(Long areaCode,DefaultReturnResult defaultReturnResult){
    3. DeliveryArea deliveryArea = deliveryareaManager.findEnableDeliveryAreaByCode(areaCode + "");
    4. if (isNullOrEmpty(deliveryArea)){
    5. defaultReturnResult.setResult(false);
    6. defaultReturnResult.setStatusCode("deliveryArea.not.exist");
    7. return;
    8. }
    9. //************************************************************************
    10. AreaDeliveryMode areaDeliveryMode = areaModeManager.findAreaDeliveryModeByAreaId(deliveryArea.getId());
    11. if (isNullOrEmpty(areaDeliveryMode)){
    12. defaultReturnResult.setResult(false);
    13. defaultReturnResult.setStatusCode("deliveryArea.has.not.areamode");
    14. return;
    15. //************************************************************************
    16. deliveryAreaViewCommand = (DeliveryAreaViewCommand) ConvertUtils.convertTwoObject(deliveryAreaViewCommand, areaDeliveryMode);
    17. Date now = toDate(DateUtil.toString(new Date(), COMMON_TIME), COMMON_TIME);
    18. boolean flag = false;
    19. //************************************************************************************************
    20. String firstDeliveryStartTime = deliveryAreaViewCommand.getFirstDeliveryStartTime();
    21. String firstDeliveryEndTime = deliveryAreaViewCommand.getFirstDeliveryEndTime();
    22. if (YES.equals(deliveryAreaViewCommand.getFirstDayDelivery()) && isNotNullOrEmpty(firstDeliveryStartTime) && isNotNullOrEmpty(firstDeliveryEndTime)){
    23. // 时间是否允许
    24. flag = DateUtil.isInTime(now, toDate(areaDeliveryMode.getFirstDeliveryStartTime(), COMMON_TIME), toDate(areaDeliveryMode.getFirstDeliveryEndTime(), COMMON_TIME));
    25. }
    26. // 是否支持次日达
    27. String secondDeliveryEndTime = areaDeliveryMode.getSecondDeliveryEndTime();
    28. String secondDeliveryStartTime = areaDeliveryMode.getSecondDeliveryStartTime();
    29. if (YES.equals(areaDeliveryMode.getSecondDayDelivery()) && isNotNullOrEmpty(secondDeliveryStartTime) && isNotNullOrEmpty(secondDeliveryEndTime)){
    30. // 时间是否允许
    31. flag = DateUtil.isInTime(now, toDate(secondDeliveryStartTime, COMMON_TIME), toDate(secondDeliveryEndTime, COMMON_TIME));
    32. }
    33. String thirdDeliveryStartTime = areaDeliveryMode.getThirdDeliveryStartTime();
    34. String thirdDeliveryEndTime = areaDeliveryMode.getThirdDeliveryEndTime();
    35. if (YES.equals(areaDeliveryMode.getThirdDayDelivery()) && isNotNullOrEmpty(thirdDeliveryStartTime) && isNotNullOrEmpty(thirdDeliveryEndTime)){
    36. // 时间是否允许
    37. flag = DateUtil.isInTime(now, toDate(secondDeliveryStartTime, COMMON_TIME), toDate(secondDeliveryEndTime, COMMON_TIME));
    38. }
    39. //************************************************************************************************
    40. defaultReturnResult.setResult(flag);
    41. }