Java开发中对于日期、时间的操作非常频繁,但是使用java.util.Calendar让人感到无比郁闷。
Joda-Time提供了一组Java类包用于处理包括ISO8601标准的date和time。可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成。并且 Joda 与 JDK 是可互操作的。
以下通过对比DateTime和Calendar的使用让我们来了解下DateTime的更加方便的用法。
1 创建2016-07-22 10:00:01的对象
Calendar c = Calendar.getInstance();
c.set(2016,Calendar.JULY,22,10,0,1);
Joda定义如下
DateTime dateTime = new DateTime(2016,7,22,10,0,1);
2 在这个时间点上加90天
Calendar calendar = Calendar.getInstance();
calendar.set(2016, Calendar.JULY, 22, 10, 0, 1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
calendar.add(Calendar.DAY_OF_MONTH, 90);
System.out.println(sdf.format(calendar.getTime()));
Joda实现如下
DateTime dateTime = new DateTime(2016, 7, 22, 10, 0, 1);
DateTime dateTime90 = dateTime.plusDays(90);
System.out.println(dateTime90.toString("yyyyMMddHHmmss"));
3 计算某个时间点在90天后的某天在下一个月的当前周最后一天的日期
Joda很轻易的实现了:
DateTime day = dateTime.plusDays(90).plusMonths(1).dayOfWeek().withMaximumValue();
System.out.println(day.toString("yyyyMMddHHmmss"));
那么calendar该如何实现呢?大家自己想吧
4 Joda 和 JDK 互操作性,joda允许与JDk中的java.util.Date 的实例(和 Calendar)进行相互转换。
Calendar calendar = Calendar.getInstance();
DateTime dateTime = new DateTime(2016, 7, 22, 10, 0, 1);
System.out.println(dateTime.plusDays(90).plusMonths(1).dayOfWeek().withMaximumValue().toString("yyyyMMddHHmmss"));
calendar.setTime(dateTime.toDate())
5下面的代码将计算五年前的第二个月的最后一天:
DateTime now = SystemFactory.getClock().getDateTime();
DateTime then = now.minusYears(5) // five years ago
.monthOfYear() // get monthOfYear property
.setCopy(2) // set it to February
.dayOfMonth() // get dayOfMonth property
.withMaximumValue();// the last day of the month
6计算两个日期间隔的天数
LocalDate start=new LocalDate(2015, 11,14);
LocalDate end=new LocalDate(2016, 01, 15);
int days = Days.daysBetween(start, end).getDays();
7时间解析
DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
DateTime dateTime2 = DateTime.parse("2015-10-20 23:20:41", format);
或者
DateTime dt2 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime("2016-04-20 01:20:39");
8判断是否闰月
DateTime dt4 = new DateTime();
org.joda.time.DateTime.Property month = dt4.monthOfYear();
System.out.println("是否闰月:" + month.isLeap());