Java时间处理第三方包Joda Time使用详解

 更新时间:2022年07月15日 14:51:08   作者:风鸢  
这篇文章主要为大家介绍了Java时间处理第三方包Joda Time使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

Joda-Time provides a quality replacement for the Java date and time classes.
Joda-Time is the de facto standard date and time library for Java prior to Java SE 8. Users are now asked to migrate to java.time (JSR-310).

JDK在8之前的版本,对日期时间的处理相当麻烦,有些方法设计非常反人类。而Joda-Time使用起来不仅方便,而且可读性强。虽然JDK 8引用了新的时间处理类,而且参与设计的人也正是Joda-Time的作者,但是由于各种原因,很多项目还是使用的JDK7,使用Joda-Time还是一个不错的选择。

Joda-Time体验

对比之前JDK的处理方式,使用了Joda-Time之后,代码整个神清气爽了很多。接下来就用一些简单的例子来对比一下JDk和Joda-Time的的使用。

依赖

只需要引用一个包。

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.3</version>
</dependency>

创建日期

JDK的日期是Date:

Date date = new Date();

Joda-Time的日期是DateTime:

DateTime dateTime = new DateTime();

DateTime在创建的时候还可以轻松的指定特定的日期和时间:

DateTime dateTime = new DateTime(2016, 10, 01, 00, 00);

日期格式化

JDK使用的是SimpleDateFormat来进行日期的格式化:

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);

乍看之下用起来也不麻烦,但是SimpleDateFormat是非线程安全的。

也就是说,如果在并发环境下,必须对SimpleDateFormat对象做同步处理,比如用synchronized,比如用ThreadLocal;

或者每次都new一个新的SimpleDateFormat对象,缺点显而易见,就是浪费资源。

而Joda-Time中的DateTime本身就有格式化的方法,对象直接调用即可:

DateTime dateTime = new DateTime();
String dateTimeStr = dateTime.toString("yyyy-MM-dd HH:mm:ss");

当然,如果要用转换器,Joda-Time也提供了DateTimeFormatter:

DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
String dateTimeStr = dtf.print(dateTime);

而且DateTimeFormatter是不可变的,所以是线程安全的。

SimpleDateFormat和DateTimeFormatter也都可以将字符串转换成日期:

String dateStr = "2016-09-22";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
    Date date = sdf.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = dtf.parseDateTime(dateStr);

日期计算

个人在Joda-Time使用中,最喜欢的是它的日期计算。

比如要得到40天前的日期,在JDK中,计算日期相当复杂,必须借助日历Calendar来完成:

Date today = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(today); // 设置日历
calendar.add(Calendar.DAY_OF_MONTH, -40); // 将日历往回翻40天
Date beforeDay = calendar.getTime(); // 日历返回日期

Joda-Time中,日期自带日期计算功能,非常直观:

DateTime today = new DateTime();
DateTime beforeDay = today.minusDays(40);

如果要计算两个日期相差的天数,使用JDK是这样实现的:

int diffDays = (int) ((today.getTime() - beforeDay.getTime()) / (24*60*60*1000));

Joda-Time提供了相关的方法来处理:

int diffDays = Days.daysBetween(yesterday, today).getDays();

除了天数,月数、年数计算起来都非常方便,比如月数:

int diffMonths = Months.monthsBetween(yesterday, today).getMonths();

兼容JDK日期

Joda-Time另一个使用起来非常方便的地方就是与JDK日期类的互相转换。

因为很多现成的接口可能是用JDk的日期作为入参或者出参,如果Joda-Time不能兼容,那很多方便就不复存在了。

// Date to DateTime
Date date = new Date();
DateTime dateTime = new DateTime(date);
// DateTime to Date
Date date2 = dateTime.toDate();
// Calendar to DateTime
Calendar calender = Calendar.getInstance();
DateTime dateTime2 =  new DateTime(calender);
// DateTime to Calendar
Calendar calendar2 = dateTime.toCalendar(Locale.CHINA);

以上就是Java时间处理第三方包Joda Time使用详解的详细内容,更多关于Java时间处理Joda Time的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Java中的final关键字

    详解Java中的final关键字

    子类可以在父类的基础上改写父类内容,为了避免这种随意改写的情况,Java提供了final 关键字,用于修饰不可改变内容。本文就来详细说说final关键字的使用,需要的可以参考一下
    2022-10-10
  • 详解SpringBoot开发案例之整合Dubbo分布式服务

    详解SpringBoot开发案例之整合Dubbo分布式服务

    这篇文章主要介绍了详解SpringBoot开发案例之整合Dubbo分布式服务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Spring Boot虚拟线程Webflux在JWT验证和MySQL查询性能比较

    Spring Boot虚拟线程Webflux在JWT验证和MySQL查询性能比较

    这篇文章主要为大家介绍了Spring Boot虚拟线程与Webflux在JWT验证和MySQL查询上的性能比较,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Intellij IDEA创建web项目的超详细步骤记录

    Intellij IDEA创建web项目的超详细步骤记录

    如果刚开始接触IDEA,或者之前使用的是eclipse/myEclipse的话,即使是创建一个JAVA WEB项目,估计也让很多人费了好几个小时,下面这篇文章主要给大家介绍了关于Intellij IDEA创建web项目的超详细步骤,需要的朋友可以参考下
    2022-08-08
  • 解读JSONArray删除元素的两种方式

    解读JSONArray删除元素的两种方式

    这篇文章主要介绍了解读JSONArray删除元素的两种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java设计模式之代理模式原理及实现代码分享

    Java设计模式之代理模式原理及实现代码分享

    这篇文章主要介绍了Java设计模式之代理模式原理及实现代码分享,设计代理模式的定义,静态代理,动态代理,jdk动态代理实现步骤,原理及源码等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 浅谈java多态的实现主要体现在哪些方面

    浅谈java多态的实现主要体现在哪些方面

    下面小编就为大家带来一篇浅谈java多态的实现主要体现在哪些方面。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • 详解Android开发中Fragment的使用

    详解Android开发中Fragment的使用

    这篇文章主要介绍了详解Android开发中Fragment的使用,包括Java代码中调用Fragment的方法,需要的朋友可以参考下
    2015-07-07
  • 单例Bean注入多例Bean属性失效问题的四种解决方案

    单例Bean注入多例Bean属性失效问题的四种解决方案

    在实际的开发过程中,我们有可能会遇到这样一个场景:多例对象 A 需要作为属性注入给单例对象 B,但是我们每次获取 B 的时候,发现注入的 A 每次都是同一个,并不是多例的,所以本文给大家介绍了如何解决单例Bean注入多例Bean属性失效问题,需要的朋友可以参考下
    2024-05-05
  • Java socket通信模拟QQ实现多人聊天室

    Java socket通信模拟QQ实现多人聊天室

    Socket在Java实战网络通信编程应用中有非常重要的作用,你想要跟别人联系都得通过socket占据端口来实现,掌握Socket技术不仅在聊天应用程序中需要用到(比如QQ什么的都都是用socket来写的),而且对于学习 Asp.net 也非常有帮助
    2022-07-07

最新评论