在 Java8 以前,时间和日期的类库很难用,而且有线程安全等诸多问题。

Joda time 弥补了 Java 在这方面的不足,但是在 Java8 时,增加了 java.time 包,对 Java 在日期 API 方面的进行了增强,这些代码实现了 JSR-310 的标准。Joda 的官方推荐迁移到 Java8 的时间类库上来。

下面来详细对比对比一下两个类库,看看 Java8 的日期 API 是否能真正替代 Joda time。

基础概念对比

Joda Date 的核心概念,这些概念在 java time 中基本也能找到对应:

instant

表示一个时刻,使用从 1970-01-01 00:00:00 至今的毫秒数表示

Joda time:

DateTime dt = new DateTime();

Instant instant = dt.toInstant();

复制代码

Java time:

Clock clock = Clock.systemDefaultZone();

Instant instant = clock.instant();

复制代码

interval

表示两个 instant 之间的间隔,左闭右开。

Joda time:

DateTime dt = new DateTime();

DateTime dt1 = new DateTime();

Interval interval = new Interval(dt.toInstant(), dt1.toInstant());

复制代码

java time 中没有提供类似的 API,因为 JSR-310 标准中没有这个概念。

duration

用毫秒表示的时间段,通常从 interval 获得 Joda time:

DateTime dt = new DateTime();

DateTime dt1 = new DateTime();

Interval interval = new Interval(dt.toInstant(), dt1.toInstant());

Duration duration = interval.toInstant();

复制代码

Java time:

LocalDateTime l1 = LocalDateTime.now();

LocalDateTime l2 = LocalDateTime.now();

Period period = Period.between(l1.toLocalDate(), l2.toLocalDate());

复制代码

period

同样表示时间段,比如 3年,5个月,而 duration 使用毫秒表示

Joda time:

DateTime dt1 = new DateTime();

DateTime dt2 = new DateTime();

Period period = Period.fieldDifference(dt1.toLocalDateTime(), dt2.toLocalDateTime());

复制代码

Java time:

LocalDateTime l1 = LocalDateTime.now();

LocalDateTime l2 = LocalDateTime.now();

Period period = Period.between(l1.toLocalDate(), l2.toLocalDate());

复制代码

chronology

年表,这是 joda-time 设计的基础

Joda time:

DateTime dt = new DateTime();

Chronology chronology = dt.getChronology();

复制代码

Java time:

LocalDateTime localDateTime = LocalDateTime.now();

Chronology ch = localDateTime.getChronology();

复制代码

timezones

表示时区。

Joda time:

DateTime dt = new DateTime();

DateTimeZone dateTimeZone = dt.getZone();

Set zones = DateTimeZone.getAvailableIDs();

复制代码

Java time:

Clock clock = Clock.systemDefaultZone();

ZoneId zoneId = clock.getZone();

Set zones = ZoneId.getAvailableZoneIds();

复制代码

从上面可以看到,除了 JSR-310 中没有的 Interval 的定义之外,这两个库在基础概念方面的实现相差不大。

因为 Unix 系统从 1970-01-01 00:00:00 开始计时,这个时间也称之为 Epoch Time,后续使用 Unix 的这种计时方式。

具体使用

Joda time 依赖 JDK5 及后续版本,没有额外的依赖。

为了起到对比的效果,挑几个比较常用的场景进行对比:

获取 1970 至今的毫秒数

获取当前时间

获取年、月、日、星期几

日期的增减

日期的格式化

获取时间戳

在代码中,经常会使用这个功能来表示唯一性:

Joda time:

DateTime dt = new DateTime();

long mills = dt.getMillis();

复制代码

Java time:

Clock clock = Clock.systemDefaultZone();

long mills = clock.millis();

复制代码

获取当前时间

这块两个库没有太大的差异:

Joda time:

DateTime dt = new DateTime();

LocalDateTime localDateTime = dt.toLocalDateTime();

复制代码

Java time:

LocalDateTime localDateTime = LocalDateTime.now();

复制代码

获取年、月、日、星期几

Joda time:

DateTime dt = new DateTime();

int dayOfYear = dt.getDayOfYear();

int dayOfMonth = dt.getDayOfMonth();

int dayOfWeek = dt.getDayOfWeek();

int hourOfDay = dt.getHourOfDay();

复制代码

Java time:

Clock clock = Clock.systemDefaultZone();

LocalDateTime localDateTime = LocalDateTime.now(clock);

int dayOfYear = localDateTime.getDayOfYear();

int dayOfMonth = localDateTime.getDayOfMonth();

int dayOfWeek = localDateTime.getDayOfWeek().getValue();

int hourOfDay = localDateTime.getHour();

复制代码

获取这些值两个库也没有太大的差异,但是对于一些场景,比如我想获得 "星期四" 这个字符串。 在 Joda 库中,可以 dt.dayOfWeek().getAsShortText(); // 星期四 这样获得。在 Java 中,localDateTime.getDayOfWeek().name(); //THURSDAY 只能获取到英文。

Joda time 在本地化方面比 Java time做的更好。

日期增减

Joda time:

DateTime dt = new DateTime();

dt = dt.plusDays(2); //当前日期添加两天

dt = dt.plusHours(5); // 当前时间加上两个小时

dt = dt.minusDays(1); // 当前日期减一天

dt = dt.minusHours(2); // 当前日期减两个小时

复制代码

Java time:

LocalDateTime localDateTime = LocalDateTime.now();

localDateTime = localDateTime.plusDays(2); // 增加两天

localDateTime = localDateTime.plusHours(2); // 增加两个小时

localDateTime = localDateTime.minusDays(1); //减少一天

localDateTime = localDateTime.minusHours(1); // 减少一个小时

复制代码

日期的格式化

日期格式化是日常使用最频繁的功能,下面来对比一下这两者的区别。

Joda time:

// 方式一

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");

DateTime dt = new DateTime();

System.out.println(dt.toString(formatter));

// 方式二

String dateFormat = "yyyy-MM-dd HH:mm:ss";

System.out.println(dt.toString(dateFormat));

复制代码

Java time:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(formatter.format(localDateTime));

复制代码

通过上面的对比,可以发现这两个类库都可以完成相同的功能。虽然在细节上是有一些细微的差别。

java.util.Date 是 Java 中最早的日期类,后来就不推荐使用这个类了,java.util.Calendar 用来替代 Date。Calendar 有 Date 的所有功能,并且提供了更加丰富的获取年月日的 API。

Calendar 是一个虚拟类,GregorianCalendar 则是 Calendar 的实现类。

Java time 与 java.util 下的时间类相互转化,可以将 Date 或者 Calendar 转化成 Java time 中的 LocalDateTime.

java.util.Date 转 java.time.LocalDateTime:

Date date = new Date();

LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());

复制代码

java.util.Carlendar 转 java.time.LocalDateTime:

Calendar calendar = Calendar.getInstance();

LocalDateTime localDateTime = LocalDateTime.ofInstant(calendar.toInstant(), ZoneId.systemDefault());

复制代码

Joda time 也可以与 java.util.Date 可以进行相互的转化:

// from Joda to JDK

DateTime dt = new DateTime();

Date jdkDate = dt.toDate();

// from JDK to Joda

dt = new DateTime(jdkDate);

// from Joda to JDK

DateTime dt = new DateTime();

Calendar jdkCal = dt.toCalendar(Locale.CHINESE);

// from JDK to Joda

dt = new DateTime(jdkCal);

// from Joda to JDK

DateTime dt = new DateTime();

GregorianCalendar jdkGCal = dt.toGregorianCalendar();

// from JDK to Joda

dt = new DateTime(jdkGCal);

复制代码

设计思想

Joda time 与 Java time 在功能上已经相差不大,常用的功能这两个类库都可以完成,而且两个库都是线程安全的。

但我认为 Joda time 的 API 更加简洁一些,Joda time 的使用可以直接从 DateTime 这个类开始。而 Java time 的使用则更加繁琐。

从设计上来说 Java time 都不再使用 new 来创建实例,而是使用工厂方法来创建实例。这点上比 Joda time 的设计要更好,而且更加安全。

既然 Joda time 都推荐迁移回 Java time 了,那么最终肯定是要迁移的。但是目前来说,我觉得 Joda time 用起来更加顺手一些,暂时还会继续使用这个。

关注微信公众号,聊点其他的

java8 joda_Java基础之如何取舍Joda与 Java8 日期库相关推荐

  1. java8 时间加一秒_java8 时间加一秒_java8新的时间日期库及使用示例

    来自:Java译站 链接:http://it.deepinmind.com/java/2015/03/17/20-examples-of-date-and-time-api-from-Java8.ht ...

  2. C基础——目标代码文件、可执行文件和库

    目标代码文件.可执行文件和库 C编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行的机器语言代码.C分两步完成这一工作:编译和链接.编译器将源代码转换为中间代码,链接器将此中间代 ...

  3. CV:计算机视觉技术之图像基础知识(一)—以python的cv2库来了解计算机视觉图像基础(傅里叶变换-频域-时域/各种滤波器-线性-非线性-均值-中值-高斯-双边)

    CV:计算机视觉技术之图像基础知识(一)-以python的cv2库来了解计算机视觉图像基础(傅里叶变换-频域-时域/各种滤波器-线性-非线性-均值-中值-高斯-双边) 目录 一.图像中的傅里叶变换 1 ...

  4. 人们常说的微型计算机简称为 机,(精华版)国家开放大学电大专科《计算机文化基础》网络课单项选择题题库及答案...

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...

  5. 计算机基础及ms office应用题库,2020年9月计算机等级考试[计算机基础及MS Office应用]综合训练题库/网页版...

    &nbsp&nbsp[导读]:2020年9月计算机等级考试[计算机基础及MS Office应用]综合训练题库/网页版,更多全国等级考试报名时间.考试时间以及考试模拟试题 ,请访问易考吧 ...

  6. Java8 面试基础知识宝典【主要以问题的形式记录,SE,EE,锁机制,框架,数据库等】

    目录 JavaSE 8 基础语法 9 Q1:简单说说Java有哪些数据类型 Q2:float number=3.4;有没有问题?为什么?默认类型[int.double] Q3:字符串拼接的方式以及效率 ...

  7. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用

    本文是慕课网大牧莫邪老师的视频教程一课掌握Lambda表达式语法及应用的学习笔记.如果觉得内容对你有用,可以购买老师的课程支持一下,课程价格1元,十分良心了. 1. 课程介绍 2. 为什么引入Lamb ...

  8. Java8时间日期库DateTime API及示例

    背景 Java对日期,日历及时间的处理一直以来都饱受诟病,比如java.util.Date和java.util.Calendar类易用性差,不支持时区,非线程安全;还有用于格式化日期的类DateFor ...

  9. java8函数式编程 视频_快速掌握Java8 Stream函数式编程技巧

    函数式编程优势"函数第一位",即函数可以出现在任何地方. 可以把函数作为参数传递给另一个函数,还可以将函数作为返回值. 让代码的逻辑更清晰更优雅. 减少了可变量(Immutable ...

最新文章

  1. linux中类似findfirst的函数,findfirst函数的用法
  2. 如何提高网络安全指数
  3. 深入浅出了解OCR识别票据原理(Applying OCR Technology for Receipt Recognition)
  4. YUV420数据格式详解
  5. kubernetes架构及核心概念
  6. 微信公众号内嵌跳转微信小程序方案总结
  7. 计算机管理里面删打印机就卡住了,打印机任务无法删除怎么办-解决打印机任务无法删除的方法 - 河东软件园...
  8. php无刷新分页插件,帝国cms增加Ajax加载更多功能,无刷新Ajax表分页插件使用说明_励翔科技帝国cms开发中心...
  9. 【经济模型】CAPM模型实例验证
  10. 多层感知器(Muti-Layer Perception ,MLP)
  11. Rocky Linux Yum源替换位上海交大镜像站点
  12. 人工智能并不像你想象的那么迫在眉睫
  13. 获取处于选中状态的checkbox的id值
  14. linux icc编译器,icc编译器
  15. git did not exit cleanly
  16. Android 怎么实现支持所有View的通用的下拉刷新控件
  17. 搭建最炫酷的 Windows Terminal 全新命令行更新以及美化指南 微软新版终端工具安装美化教程
  18. 远程桌面 CredSSP加密Oracle修正 解决方法
  19. 输入两个自然数min,max,计算、输出[min,max]中的超级素数的个数#C语言
  20. 历史记录画笔 photoshop基础教程-历史记录画笔工具

热门文章

  1. 如何找到微信的服务器地址
  2. 没人带宝宝,所以才要送去托育园?
  3. 三菱plc恒压供水程序+威纶触摸屏程序 以控制水泵一用一备、一拖二、一拖三、一拖四、一拖四带小泵恒压功能
  4. 汉语词典快速查询算法研究
  5. 组策略设置屏保的方法
  6. 昔日的手游大作,《无尽之剑》系列如今为何走向英雄末路?
  7. org.springframework.data.mapping.PropertyReferenceException: No property item found for type BItem!
  8. 全新的备份利器推荐:Duplicity使用评测
  9. abb机器人常见维故障现象
  10. 网络工程师学习路线?