摘要:在之前的版本,对日期时间的处理相当麻烦,有些方法设计非常反人类。体验对比之前的处理方式,使用了之后,代码整个神清气爽了很多。
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的的使用。
依赖只需要引用一个包。
创建日期joda-time joda-time 2.3
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);
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/66048.html
摘要:要从头开始,请继续使用构建。文件夹应包含项目运行单元测试的报告。由于该项目尚未进行任何单元测试,因此该报告无效。使用构建项目是启动构建的首选方式。现在可用于构建项目。概要恭喜您现在已经创建了一个简单而有效的构建文件,用于构建项目。 本指南将引导您使用Gradle构建一个简单的Java项目。 你要构建什么 您将创建一个简单的应用程序,然后使用Gradle构建它。 你需要什么 大约15分...
摘要:开源时间日期库是很好的替代,另外中也推出了新的库,设计理念与相似。令时间和日期值变得易于管理操作和理解。格式化一个日期时间的具体域包括个年月日时分秒毫秒星期,分别用不同字母表示。 此前Java处理时间日期所使用的 Date 和 Calendar 被诟病不已,Calendar 的主要问题对象可变,而像时间和日期这样的类应该是不可变的,另外其概念模型也有不明确的地方,月份计算从0开始等等。...
摘要:最后运行,如下图所示,就说明跑通了总结之前看别人的博客,有选择项,自己弄死活跑不通。选择那项,啥都不选选择那项。还要注意打包方式,,, 一.工程目录 下面是搭建之后的目录showImg(https://segmentfault.com/img/remote/1460000015755454?w=407&h=467); 先看一下目录关系 taotao-parent(父工程管理jar包的版...
摘要:要从头开始,请继续使用构建。现在您已经准备好使用构建项目,下一步是安装。项目使用名为的文件定义。项目所属的组或组织。默认情况下,所有依赖项都作为依赖项确定范围。概要恭喜您已经为构建项目创建了一个简单而有效的项目定义。 本指南将指导您使用Maven构建一个简单的Java项目。 你要构建什么 您将创建一个提供一天中时间的应用程序,然后使用Maven构建它。 你需要什么 大约15分钟 最喜...
摘要:由于标题长度限制,原题是这样某系统万,每十分钟统计一下请求次数最多的个。请求写到日志的话,其实就是超大文件中统计问题。 由于标题长度限制,原题是这样:某系统QPS100万,每十分钟统计一下请求次数最多的100个IP。ip请求写到日志的话,其实就是超大文件中统计top k问题。10分钟6亿条记录,大约是10G级别,所以对于一般单机处理来讲不能一次性加载到内存计算。所以分治算法是处理这类问...
阅读 2308·2021-08-26 14:14
阅读 2676·2019-08-29 13:07
阅读 2083·2019-08-26 11:44
阅读 675·2019-08-26 10:11
阅读 2409·2019-08-23 15:43
阅读 3077·2019-08-23 14:17
阅读 384·2019-08-23 12:36
阅读 2082·2019-08-22 15:20