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

目录
  • 引言
  • Joda-Time体验
    • 依赖
    • 创建日期
    • 日期格式化
    • 日期计算
    • 兼容JDK日期

引言

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的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java第三方库JodaTime的具体使用

    目录 1.使用JodaTime 2.获取DateTime实例 3.使用DateTime的方法 4.使用Property的 5.其他的静态方法 结语 Java8之前的时间库中存在一些设计不好的地方,导致用起来非常地不方便,又容易出错.比如,要实现在指定的日期的基础上面增加指定的时间的操作,你需要些大量的样板代码:而它的月份从0开始,稍有不慎就会掉入坑中.所以,通常我们使用第三方库Joda Time来进行时间相关的操作. 1.使用JodaTime JodaTime在Github上面的主页:JodaT

  • 一篇文章弄懂Java8中的时间处理

    目录 前言 LocalDateTime ZonedDateTime Instant 总结 前言 java8借鉴了第三方日期库joda很多的优点 java.time包 类名 描述 Instant 时间戳 Duration 持续时间,时间差 LocalDate 只包含日期,比如:2020-05-20 LocalTime 只包含时间,比如:13:14:00 LocalDateTime 包含日期和时间,比如:2020-05-20 13:14:00 Period 时间段 ZoneOffset 时区偏移量,

  • Java 进行时间处理的步骤

    一.Calendar (1).Calender介绍 Calendar的中文翻译是日历,实际上,在历史上有着许多种计时的方法.所以为了计时的统一,必需指定一个日历的选择.那现在最为普及和通用的日历就是"Gregorian Calendar".也就是我们在讲述年份时常用"公元**年".Calendar 在 Java 中是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现.Calendar.getInstance()中所获得

  • 详解JAVA 时间处理相关类

    时间处理相关类: 1.java.util.Date:时间类 2.java.text.DateFormat:时间格式化类(抽象类),实现类:java.text.SimpleDateFormat 3.java.util.Calendar:日历类(抽象类),实现类:java.util.GergorianCalendar 1.java.util.Date 时间就是一个数轴,在计算机中,1970年1月1日00:00:00定位基准时间,也就是数轴的原点,每个度量单位是毫秒(1000毫秒=1秒) java中我

  • 学习Java中的日期和时间处理及Java日历小程序的编写

    Java 在 java.util 包中提供了 Date 类,这个类封装了当前的日期和时间. Date 类支持两种构造函数.第一个构造函数初始化对象的当前日期和时间. Date( ) 下面的构造函数接收一个参数等于自1970年1月1日午夜起已经过的毫秒数 Date(long millisec) 一旦有一个可用的日期对象,可以调用以下任何一种支持的方法使用时间: SN 方法和描述 1 boolean after(Date date) 如果调用Date对象包含或晚于指定的日期则返回true,否则,返回

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

    目录 引言 Joda-Time体验 依赖 创建日期 日期格式化 日期计算 兼容JDK日期 引言 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.t

  • go自动下载所有的依赖包go module使用详解

    今天在学习dubbo-go的时候,下载了dubbo-go的example,依赖的包太多了,之前都是手动下载某个依赖的包,现在手动一个一个 go get 那太麻烦了.因为我是搞java的,刚开始用go的时候感觉有点奇怪,go代码所依赖的所有的第三方库都放在GOPATH这个目录下面,这就导致了同一个库只能保存一个版本的代码.如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?总不能改包名吧,看了一下 dubbo-samples/golang/的代码 发现了有个 go.mod文件,百度一下 g

  • Java代码中与Lua相互调用实现详解

    目录 一.方案 二.性能测试 1. ScriptEngine调用方式 2. Globals调用方式 3. lua调用java 三.结论 四.其他调用方式? 一.方案 Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试. 目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的小伙伴欢迎关注下. 目前最常见的方案:luaj,纯Java实现的Lua解析器,基于Lua 5.2 LuaJ的原理:用Java实现了一套Lua的编译器

  • java 并发中的原子性与可视性实例详解

    java 并发中的原子性与可视性实例详解 并发其实是一种解耦合的策略,它帮助我们把做什么(目标)和什么时候做(时机)分开.这样做可以明显改进应用程序的吞吐量(获得更多的CPU调度时间)和结构(程序有多个部分在协同工作).做过java Web开发的人都知道,Java Web中的Servlet程序在Servlet容器的支持下采用单实例多线程的工作模式,Servlet容器为你处理了并发问题. 原子性 原子是世界上的最小单位,具有不可分割性.比如 a=0:(a非long和double类型) 这个操作是不

  • Java 中DateUtils日期工具类的实例详解

    Java 中DateUtils日期工具类的实例详解 介绍 在java中队日期类型的处理并不方便,通常都需要借助java.text.SimpleDateFormat类来实现日期类型 和字符串类型之间的转换,但是在jdk1.8之后有所改善,jdk1.7以及之前的版本处理日期类型并不方便, 可以借助Joda Time组件来处理,尤其是日期类型的一些数学操作就更是不方便. java代码 /** * * 日期工具类 java对日期的操作一直都很不理想,直到jdk1.8之后才有了本质的改变. * 如果使用的

  • java并发学习之BlockingQueue实现生产者消费者详解

    1.介绍 阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满:从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空.并发包下很多高级同步类的实现都是基于BlockingQueue实现的. JDK7提供了以下7个阻塞队列: ArrayBlockingQueue :由数组结构组成的有界阻塞队列. LinkedBloc

  • Java服务调用RestTemplate与HttpClient的使用详解

    目录 概述 RestTemplate 概述及依赖 配置类 使用 GET请求 POST请求 上传文件 HttpClient 概述 使用 概述 常见的远程调用方式有以下2种: RPC: Remote Produce Call远程过程调用,类似的还有RMI(remote method invoke).自定义数据格式,基于原生TCP通信,速度快,效率高.早期的webservice,现在热门的dubbo,都是RPC的典型代表. Http: http其实是一种网络传输协议,基于TCP,规定了数据传输的格式.

  • Java实现API sign签名校验的方法详解

    目录 1. 前言 2. 签名生成策略 3. API 签名算法 Java 实现 4. 测试一下 1. 前言 目的:为防止中间人攻击. 场景: 项目内部前后端调用,这种场景只需要做普通参数的签名校验和过期请求校验,目的是为了防止攻击者劫持请求 url 后非法请求接口. 开放平台向第三方应用提供能力,这种场景除了普通参数校验和请求过期校验外,还要考虑 3d 应用的授权机制,不被授权的应用就算传入了合法的参数也不能被允许请求成功. 2. 签名生成策略 接下来详述场景 2,其实场景 1 也包含在场景 2

  • Java面试必备之JMM高并发编程详解

    目录 一.什么是JMM 二.JMM定义了什么 原子性 可见性 有序性 三.八种内存交互操作 四.volatile关键字 可见性 volatile一定能保证线程安全吗 禁止指令重排序 volatile禁止指令重排序的原理 五.总结 一.什么是JMM JMM就是Java内存模型(java memory model).因为在不同的硬件生产商和不同的操作系统下,内存的访问有一定的差异,所以会造成相同的代码运行在不同的系统上会出现各种问题.所以java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差

  • Java 中 Class Path 和 Package的使用详解

    目录 一. 类路径 (class path) 二. 包 (package) 三. jar 文件 一. 类路径 (class path) 当你满怀着希望安装好了 java, 然后兴冲冲地写了个 hello world,然后编译,运行, 就等着那两个美好的单词出现在眼前, 可是不幸的是, 只看到了 Can't find class HelloWorld 或者 Exception in thread "main" java.lang.NoSuchMethodError : maain.为什么

随机推荐