Joda与Jdk1.8日期知多少
2017-11-18 22:38
246 查看
题记
在项目当中我们经常会遇到一些处理时间的场景,譬如要取一个指定的时间、某个时间加上指定的天数、获取某个月份的星期几、某一年的某一个月的最后一天等等。这些场景在JDK1.8之前想想这些需求都是需要自己取封装的,如果你没有用过Joda的情况下。现在我们就来比较一下这两个还有jdk1.8之前要实现这些功能的代码对比。方案
joda 官网:http://www.joda.org/joda-time/本方案测试的环境如下:
1. maven、jdk1.8
2. maven 需要添加joda的jar包,本实验使用的是2.9.4版本
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.4</version> </dependency>
下面我们就来看看有了joda和jdk1.8环境之后,我们处理题记中的问题会有多么的方便,代码也会变得非常的简洁。
向某一个瞬间加上 90 天
System.out.println("================================以 JDK<1.8 的方式向某一个瞬间加上 90 天并输出结果===================================="); Calendar calendar = Calendar.getInstance(); calendar.set(2000, Calendar.JANUARY, 1, 0, 0, 0); SimpleDateFormat sdf = new SimpleDateFormat("E MM/dd/yyyy HH:mm:ss.SSS"); calendar.add(Calendar.DAY_OF_MONTH, 90); System.out.println(sdf.format(calendar.getTime())); System.out.println("================================以 JDK1.8 的方式向某一个瞬间加上 90 天并输出结果===================================="); LocalDateTime currentTime = LocalDateTime.of(2000, 1, 1, 0, 0, 0, 0); System.out.println(currentTime.plusDays(90).format(DateTimeFormatter.ofPattern("E MM/dd/yyyy HH:mm:ss.SSS"))); System.out.println("================================以 Joda 的方式向某一个瞬间加上 90 天并输出结果===================================="); DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0); System.out.println(dateTime.plusDays(90).toString("E MM/dd/yyyy HH:mm:ss.SSS"));
计算 11 月中第一个星期二
System.out.println("================================以 JDK<1.8 的方式计算 11 月中第一个星期二并输出结果===================================="); System.out.println("jdk1.8之前是现实这个逻辑是非常复杂的,要自己实现逻辑"); System.out.println("================================以 JDK1.8 的方式计算 11 月中第一个星期二并输出结果===================================="); LocalDate testDateNow = LocalDate.now(); testDateNow = testDateNow.withMonth(11).with(TemporalAdjusters.firstInMonth(DayOfWeek.TUESDAY)); System.out.println("JDK1.8 的方式计算 11 月中第一个星期二:"+testDateNow); System.out.println("================================以 Joda 的方式计算 11 月中第一个星期二并输出结果===================================="); /** * .setCopy("Monday") 是整个计算的关键。不管中间 LocalDate 值是多少,将其 dayOfWeek 属性设置为 Monday 总是能够四舍五入, * 这样的话,在每月的开始再加上 6 天就能够让您得到第一个星期一。再加上一天就得到第一个星期二。Joda 使得执行此类计算变得非常容易。 */ org.joda.time.LocalDate cur = new org.joda.time.LocalDate(); org.joda.time.LocalDate electionDate = cur.monthOfYear().setCopy(11).dayOfMonth().withMinimumValue().plusDays(6).dayOfWeek().setCopy(DateTimeConstants.MONDAY).plusDays(1); System.out.println("Joda 的方式计算 11 月中第一个星期二:"+electionDate);
计算五年后的第二个月的最后一天
System.out.println("================================以 JDK<1.8 的方式计算五年后的第二个月的最后一天并输出结果===================================="); System.out.println("jdk1.8之前是现实这个逻辑是非常复杂的,要自己实现逻辑"); System.out.println("================================以 JDK1.8 的方式计算五年后的第二个月的最后一天并输出结果===================================="); LocalDate testDateNowLast = LocalDate.now(); testDateNowLast = testDateNowLast.plusYears(5).withMonth(2).with(TemporalAdjusters.lastDayOfMonth()); System.out.println("JDK1.8 的方式计算五年后的第二个月的最后一天:"+testDateNowLast); System.out.println("================================以 Joda 的方式计算五年后的第二个月的最后一天并输出结果===================================="); org.joda.time.LocalDate curr = new org.joda.time.LocalDate(); org.joda.time.LocalDate lastDayDate = curr.plusYears(5).monthOfYear().setCopy(2).dayOfMonth().withMaximumValue(); System.out.println("Joda 的方式计算五年后的第二个月的最后一天:"+lastDayDate);
计算两个日期相差多少年、月、周、天
System.out.println( "================================以 JDK<1.8 的方式计算两个日期相差多少年、月、周、天并输出结果===================================="); System.out.println("jdk1.8之前是现实这个逻辑是非常复杂的,要自己实现逻辑"); System.out.println( "================================以 JDK1.8 的方式计算计算两个日期相差多少年、月、周、天并输出结果===================================="); LocalDate period1 = LocalDate.now(); LocalDate period2 = LocalDate.of(2014, 1, 1); Period periodFull = Period.between(period1, period2); System.out.println("JDK1.8 的方式计算计算两个日期相差多少年零多少个月零多少天:" + Math.abs(periodFull.getYears()) + "年零" + Math .abs(periodFull.getMonths()) + "个月零" + Math.abs(periodFull.getDays()) + "天"); System.out.println("JDK1.8 的方式计算计算两个日期相差多少年:" + Math.abs(period1.until(period2, ChronoUnit.YEARS))); System.out.println("JDK1.8 的方式计算计算两个日期相差多少个月:" + Math.abs(period1.until(period2, ChronoUnit.MONTHS))); System.out.println("JDK1.8 的方式计算计算两个日期相差多少周:" + Math.abs(period1.until(period2, ChronoUnit.WEEKS))); System.out.println("JDK1.8 的方式计算计算两个日期相差多少天:" + Math.abs(period1.until(period2, ChronoUnit.DAYS))); System.out.println( "================================以 Joda 的方式计算计算两个日期相差多少年、月、周、天并输出结果===================================="); org.joda.time.LocalDate currPeriod1 = new org.joda.time.LocalDate(); org.joda.time.LocalDate currPeriod2 = new org.joda.time.LocalDate(2014, 1, 1); org.joda.time.Period periodJoda = org.joda.time.Period.fieldDifference(currPeriod1, currPeriod2); System.out.println("Joda 的方式计算计算两个日期相差多少年零多少个月零多少天:" + Math.abs(periodJoda.getYears()) + "年零" + Math .abs(periodJoda.getMonths()) + "个月零" + Math.abs(periodJoda.getDays()) + "天"); System.out .println("Joda 的方式计算计算两个日期相差多少年:" + Math.abs(Years.yearsBetween(currPeriod1, currPeriod2).getYears())); System.out.println( "Joda 的方式计算计算两个日期相差多少个月:" + Math.abs(Months.monthsBetween(currPeriod1, currPeriod2).getMonths())); System.out .println("Joda 的方式计算计算两个日期相差多少周:" + Math.abs(Weeks.weeksBetween(currPeriod1, currPeriod2).getWeeks())); System.out.println("Joda 的方式计算计算两个日期相差多少天:" + Math.abs(Days.daysBetween(currPeriod1, currPeriod2).getDays()));
获取毫秒数、判断是不是闰年
Instant instant = Instant.now(); LocalDateTime localDateTime1 = LocalDateTime.now(); System.out.println(instant); System.out.println(instant.toEpochMilli()); localDateTime1.toLocalDate().isLeapYear();//判断闰年 System.out.println(currPeriod2.monthOfYear().setCopy(2).monthOfYear().isLeap());//根据月份来判断闰年
以上便是joda和jdk1.8以及1.8之前处理对应场景的代码对比,对于joda真的是相见恨晚啊。这个项目貌似从2004年发布的第一个版本,算是一个专业的处理时间的第三方工具类。但是jdk1.8出了之后感觉也是很方便的,基本和joda代码简洁度一样,处理的场景都是比较全面的。看看类名两个都有挺多一样的,不管怎么样有了这样的工具类。对于我们写代码来说是更加方便快捷了,不至于像之前那样处理上述场景想想都头大。发上文以共勉~
参考:
https://www.ibm.com/developerworks/cn/java/j-jodatime.html
相关文章推荐
- JDK1.7和JDK1.8中日期时间使用和处理的不同
- JDK1.8新增的时间日期API
- Java初窥:JDK1.8中的日期处理
- jdk1.8日期时间组件
- jdk1.8 date日期的处理(一)
- jdk1.8 日期新API LocalDateTime,LocalDate,LocalTime 在Hibernate中无法反序列化解决方法
- 如何在JDK1.8中愉快地处理日期和时间
- java日期格式规范(JDK1.8官方文档)
- 基于JDK1.8,Android Proguard失败
- Eclipse导入Maven项目提示:Missing artifact sun.jdk:jconsole:jar:1.8
- 免费jdk1.8源码下载
- CentOS 6.5下安装Java JDK 环境(1.8)
- 1.spring boot要求最低jdk1.8,平安默认1.6问题,-》安装JDK1.8 2.maven 3.3.3要求最低jdk1.7->安装jdk 1.8
- jdk1.8新特性
- 为什么JDK 1.8中不再有永久代(permanent generation)
- 如何查自己的jdk是多少位什么版本
- java JDK1.8安装与环境配置
- winXP JDK由1.8改为1.6
- jdk1.6 1.7 1.8 运行时常量池位置的变化
- JDK 1.8 给 APK签名(Android)