Joda学习笔记

   Joda Time简介

       日常业务开发中,经常需要处理日期。比如:获取当前一个月之内的开播记录,获取十分钟之内的红包记录等等。我们之前是用java.util.Calendar实现的,直到我看到占小狼的文章->性能优化之抛弃Calendar,终于知道Joda这个好组件。用java.util.Date或者java.util.Calendar都比较繁琐。而Joda-Time 易于使用,管理,并且它提供了一组完整的功能。

  Joda和Calendar的比较

  1.      创建某一时刻的时间对象   
   //Calendar
Calendar calendar=Calendar.getInstance();
calendar.set(1994, Calendar.NOVEMBER, 1, 7, 23, 55);
//Joda
DateTime dateTime=new DateTime(1994, 12, 1, 7, 23,55);

2. 如果给一个日期加上30天,并输出结果
   //Calendar
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, 30);
System.out.println(sdf.format(calendar.getTime()));
   //Joda的瞬间加上30天
DateTime dateTime = new DateTime(2000,1,1,0,0,0,0);
System.out.println(dateTime.plusDays(30).toString("E MM/dd/yyyy HH:mm:ss.SSS");
显然Joda写法更简洁

        3. 假设你女朋友约定你2018.10.1日3天后的某天在下一个月的当前周的最后一天的日期,去烂漫的土耳其,那么你会用Calendar处理这个问题吗? 觉得Calendar心有余而力不足的赶脚。。但是JodaTime可以轻易解决这个问题:

         String dateString=

   dateTime.plusDays(3).plusMonths(1).dayOfWeek().withMaximumValue().toString("E MM/dd/yyyy HH:mm:ss.SSS");

4.性能比较
创建Calendar,Joda的dateTime对象,循环N次,比较耗时。
    long temp = System.currentTimeMillis();
for (int i = 0; i < N; i++) {
// DateTime dateTime = new DateTime(2012,12,15,18,23,55);
Calendar calendar = Calendar.getInstance();
calendar.set(2012, Calendar.NOVEMBER, 15, 18, 23, 55);
}
System.out.println("result" + (System.currentTimeMillis() - temp));
单元测试发现N值越大,Joda比Calendar的耗时越低。行那个越好。

5.计算两日期相差的天数

       

  JodaTime核心类介绍
以下是几个最常用的date-time类:
DateTime:不可变的类有点类似java.util.Calendar
LocalDate: 不可变的类,表示一个本地的日期,只包含年月日
LocalTime :不可变的类,表示一个本地的时间,只包含时间(没有时区信息)
Instant :表示某一瞬间的时间点,不可变类。
LocalDateTime :包含日期和时间。

Joda-time的几个关键概念
  • 不可变性(Immutability)
  • 瞬间性(Instant)
  • 局部性(Partial)
  • 年表(Chronology)
  • 时区(Time Zone)

     不可变性

       Joda-time的类具有不可变性,因此它们的实例无法被修改。(不可变类的一个优点就是它们是线程 安全 的)。用于处理日期计算的 API 方法全部返回一个对应 Joda-time 类的新实例,同时保持原始实例不变。当我们通过一个 API 方法操作 Joda 类时,我们            必须捕捉该方法的返回值,因为我们正在处理的实例不能被修改。你可能对这种模式很熟悉,这正是 java.lang.String 的各种操作方法的工作 方式。

      瞬间性

        Instant 表示时间上的某个精确的时刻,使用从 epoch 开始计算的毫秒表示。这一定义与 JDK 相同,这就是为什么任何 Joda Instant 子类都可以与 JDK Date 和 Calendar 类兼容的原因。
        更通用一点的定义是:一个瞬间 就是指时间线上只出现一次且唯一的一个时间点,并且这种日期结构只能以一种有意义的方式出现一次

     局部性
        一个局部时间,正如我将在本文中将其称为局部时间片段一样,它指的是时间的一部分片段。瞬间性指定了与 epoch 相对的时间上的一个精确时刻,与此相反,局部时间片段指的是在时间上可以来回 “移动” 的一个时刻,这样它便可以应用于多个实例

       比如, 6  月 2 日 可以应用于任意一年的 6 月份(使用 Gregorian 日历)的第二天的任意瞬间。同样,11:06 p.m. 可以应用于任意一年的任意一天,并且每天只能使用一次。即使它们没有指定一个时间上的精确时刻,局部时间片段仍然是有用的。
       我喜欢将局部时间片段看作一个重复周期中的一点,这样的话,如果我正在考虑的日期构建可以以一种有意义的方式出现多次(即重复的),那么它就是一个局部时间。

     年表
       Joda 本质——以及其设计核心——的关键就是年表(它的含义由一个同名抽象类捕捉)。从根本上讲,年表是一种日历系统——种计算时间的特殊方式——并且是一种在其中执行日历 算法 的框架。

        受 Joda 支持的年表的例子包括:ISO(默认)、Coptic、Julian、Islamic等。

     时区

        时区是值一个相对于英国格林威治的地理位置,用于计算时间。要了解事件发生的精确时间,还必须知道发生此事件的位置。任何严格的时间计算都必须涉及时区(或相对于 GMT),

       除非在同一个时区内发生了相对时间计算(即时这样时区也很重要,如果事 件对于位于另一个时区的各方存在利益关系的话)。
       DateTimeZone 是 Joda 库用于封装位置概念的类。许多日期和时间计算都可以在不涉及时区的情况下完成,但是仍然需要了解 DateTimeZone 如何影响 Joda 的操作。默认时间,即从运行代码的机器的系统时钟检索到的时间,在大部分情况下被使用。

 

     参考文章

       https://www.jianshu.com/p/efdeda608780   使用Joda-Time优雅的处理日期时间

       https://www.ibm.com/developerworks/cn/java/j-jodatime.html

  
 
 

转载于:https://www.cnblogs.com/jay-huaxiao/p/9455055.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值