小巧实用日期处理 - DateUtil
主要由下面四部分组成
我们先来看出镜率最高的两个转换的方法 DateUtil.toString(Date, String)
, DateUtil.toDate(String, String…)
这就是我们常用来做 Date类型转成字符串类型的方法通常我们会这么写
如果有小伙伴不小心把 simpleDateFormat
声明成类的变量,在并发的情况下,可能会出现异常,参见 SimpleDateFormat在多线程下不安全 此时你可以直接使用:
示例:
DateUtil.toString(Tue Oct 16 23:49:21 CST 2012,DatePattern.COMMON_DATE_AND_TIME_WITH_MILLISECOND)
结果:
2012-10-16 23:49:21.525
此外,也经常看到小伙伴是这样创建时间戳文件夹的
Calendar calendar = Calendar.getInstance();
String userDefinedPath = calendar.get(Calendar.YEAR) + "/"
+ (calendar.get(Calendar.MONTH) + 1) + "/"
+ calendar.get(Calendar.DAY_OF_MONTH) + "/" + "propertyImage"
+ "/";
可以看到,代码更加简洁明了
2.DateUtil.toDate(String, String…) 方法
与 DateUtil.toString(Date, String)
相反的,就是将字符串转成 Date 格式
将时间字符串 dateString 使用一个或者多个不同的 datePattern 模式按照顺序转换成date类型. 经常我们会看到小伙伴写出下面的代码:
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date publishTimeDate = null;
try{
publishTimeDate = simpleDateFormat.parse(publishTime);
}catch (ParseException e1){
e1.printStackTrace();
}
可以看到直接使用 SimpleDateFormat
来写代码的话, 代码行数较多,并且还需要自行处理 ParseException
checkedException异常, 而且catch里面一般都是写的都是无用代码此时你可以一行代码搞定:
Date publishTimeDate = DateUtil.toDate(publishTime, DatePattern.COMMON_DATE_AND_TIME_WITHOUT_SECOND);
该方法,如果转换有异常,会将 ParseException
转成 IllegalArgumentException
返回,是 UnCheckedException异常
,非强行要求捕获处理
示例:
DateUtil.toDate("2016-02-33", DatePattern.COMMON_DATE) = 2016-03-04
DateUtil.toDate("2016-06-28T01:21:12-0800", "yyyy-MM-dd'T'HH:mm:ssZ") = 2016-06-28 17:21:12
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. 时间运算
聪明程序员 是这么写的
/**
* @return
*/
private Date[] getTimes(){
Date start = new Date();
Date[] dates = { start, DateUtil.getFirstDateOfThisDay(DateUtil.addMonth(start, 1)) };
return dates;
}
4.2 实例2 导出数据
程序员鼓励师:小帅哥,帮我导出7天以来的订阅邮件数据
普通程序员 是这么写的:
/* 获取上一周的数据 */
java.util.Calendar c = java.util.Calendar.getInstance();
c.add(java.util.Calendar.DAY_OF_WEEK, -7);
Date startDate = c.getTime();
Date curDate = new Date();
细细一琢磨,这段代码如果执行的话,如果系统较卡,执行到这段代码的时候,会有数据丢失
聪明程序员 是这么写的
/* 获取上一周的数据 */
Date startDate =DateUtil.getFirstDateOfThisDay(DateUtil.addDay(new Date(), -7));
Date curDate = new Date();
6. 时间比较
判断指定年 year 是否为闰年
8. 综合运用:
下面代码 美化
前
美化后:
// 判断是否支持当日达和COD
private void judgeDelivery(Long areaCode,DefaultReturnResult defaultReturnResult){
DeliveryArea deliveryArea = deliveryareaManager.findEnableDeliveryAreaByCode(areaCode + "");
if (isNullOrEmpty(deliveryArea)){
defaultReturnResult.setResult(false);
defaultReturnResult.setStatusCode("deliveryArea.not.exist");
return;
}
//************************************************************************
AreaDeliveryMode areaDeliveryMode = areaModeManager.findAreaDeliveryModeByAreaId(deliveryArea.getId());
if (isNullOrEmpty(areaDeliveryMode)){
defaultReturnResult.setResult(false);
defaultReturnResult.setStatusCode("deliveryArea.has.not.areamode");
return;
//************************************************************************
deliveryAreaViewCommand = (DeliveryAreaViewCommand) ConvertUtils.convertTwoObject(deliveryAreaViewCommand, areaDeliveryMode);
Date now = toDate(DateUtil.toString(new Date(), COMMON_TIME), COMMON_TIME);
boolean flag = false;
//************************************************************************************************
String firstDeliveryStartTime = deliveryAreaViewCommand.getFirstDeliveryStartTime();
String firstDeliveryEndTime = deliveryAreaViewCommand.getFirstDeliveryEndTime();
if (YES.equals(deliveryAreaViewCommand.getFirstDayDelivery()) && isNotNullOrEmpty(firstDeliveryStartTime) && isNotNullOrEmpty(firstDeliveryEndTime)){
// 时间是否允许
flag = DateUtil.isInTime(now, toDate(areaDeliveryMode.getFirstDeliveryStartTime(), COMMON_TIME), toDate(areaDeliveryMode.getFirstDeliveryEndTime(), COMMON_TIME));
}
// 是否支持次日达
String secondDeliveryEndTime = areaDeliveryMode.getSecondDeliveryEndTime();
String secondDeliveryStartTime = areaDeliveryMode.getSecondDeliveryStartTime();
if (YES.equals(areaDeliveryMode.getSecondDayDelivery()) && isNotNullOrEmpty(secondDeliveryStartTime) && isNotNullOrEmpty(secondDeliveryEndTime)){
// 时间是否允许
flag = DateUtil.isInTime(now, toDate(secondDeliveryStartTime, COMMON_TIME), toDate(secondDeliveryEndTime, COMMON_TIME));
}
String thirdDeliveryStartTime = areaDeliveryMode.getThirdDeliveryStartTime();
String thirdDeliveryEndTime = areaDeliveryMode.getThirdDeliveryEndTime();
if (YES.equals(areaDeliveryMode.getThirdDayDelivery()) && isNotNullOrEmpty(thirdDeliveryStartTime) && isNotNullOrEmpty(thirdDeliveryEndTime)){
// 时间是否允许
flag = DateUtil.isInTime(now, toDate(secondDeliveryStartTime, COMMON_TIME), toDate(secondDeliveryEndTime, COMMON_TIME));
}
//************************************************************************************************
defaultReturnResult.setResult(flag);
}