1. 对Calendar的优化
Calendar是线程不安全的,不能放在全局变量中使用,但是每次都要new一个Calendar对象,可能会影响性能。
在[Jackson序列化(4)— Jackson“默认的”时间格式化类—StdDateFormat解析里面,我们可以得知一种优化方案:使用clone来创建对象
。
public class Test{
//北京时间
protected final static TimeZone DEFAULT_TIMEZONE = TimeZone.getTimeZone("GMT+08:00");
//中国大陆
protected final static Locale DEFAULT_LOCALE = Locale.SIMPLIFIED_CHINESE;
/**
* 它是线程不安全的,不能直接使用,但是使用clone可以更高效的创建Calendar对象
*/
protected static final Calendar CALENDAR = new GregorianCalendar(DEFAULT_TIMEZONE, DEFAULT_LOCALE);
public static void main(String[] args) {
Calendar c1 = (Calendar) CALENDAR.clone();
c1.setTime(new Date());
Calendar c2 = (Calendar) CALENDAR.clone();
c2.setTime(new Date());
c2.add(Calendar.DAY_OF_MONTH,1);
boolean sameDay = DateUtils.isSameDay(c1, c2);
System.out.println(sameDay);
}
}
2. 比较两个Date时间是否相等
org.apache.commons.lang3.time.DateUtils#isSameDay(java.util.Calendar, java.util.Calendar)
源码
public class DateUtils {
public static boolean isSameDay(final Calendar cal1, final Calendar cal2) {
if (cal1 == null || cal2 == null) {
throw new IllegalArgumentException("The date must not be null");
}
return cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) &&
cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);
}
}
Calendar.ERA
:定义了两个字段:AD和BC。这些代表公历定义的两个时代。来判断两个日期是否是同一个世纪。
Calendar.YEAR
:来判断两个日期是否是同一年。
Calendar.DAY_OF_YEAR
:来判断两个日期是否是同一年中的同一天。
3. 获取昨天和明天的时间
public static void main(String[] args) {
//该方式是new的方式,可以使用clone的方式获取到对象。
Calendar c = Calendar.getInstance();
c.setTime(new Date());
//增加一天,减少一天为-1
c.add(Calendar.DAY_OF_MONTH, 1);
//设置时分秒(0时0分0秒)
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
Date time = c.getTime();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time));
}
可以借助Calendar的add方法来增加时间,可以使用set方法来设置时间。