Joda-Time时间处理


1.Joda-Time介绍

a.what?

    使用JDK完成时间的操作非常痛苦和繁琐.Joda tme是一个面向Java平台的易于使用的开源时间/日期库.通过使用Joda-Time我们可以轻松化解处理日期和时间的痛苦和繁琐.

  Joda-Time 令时间和日期值变得易于管理、操作和理解。事实上,易于使用是 Joda 的主要设计目标。其他目标包括可扩展性、完整的特性集以及对多种日历系统的支持。

  并且 Joda 与 JDK 是百分之百可互操作的,因此您无需替换所有 Java 代码,只需要替换执行日期/时间计算的那部分代码。

  Joda-Time提供了一组Java类包用于处理包括ISO8601标准在内的date和time。可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成。

b.why?

考虑创建一个用时间表示的某个随意的时刻,如2000年1月1日0时0分.

我如何创建一个用时间表示这个瞬间的 JDK 对象?使用 java.util.Date?

事实上这是行不通的,因为自 JDK 1.1 之后的每个 Java 版本的 Javadoc 都声明应当使用 java.util.Calendar。
Date 中不赞成使用的构造函数的数量严重限制了您创建此类对象的途径。

那么Calendar又如何呢?我们使用下面的方式创建必须的实列

Calendar calendar = Calendar.getInstance(); calendar.set(2000, Calendar.JANUARY, 1, 0, 0, 0);

用 Joda,代码应该类似如下所示:

DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0);

这一行简单代码并没有太大的区别.但是现在我们将问题稍微复杂化.

假设我们希望在这个日期上加上90天并输出结果.使用JDK

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, 90); System.out.println(sdf.format(calendar.getTime()));

使用joda-time模块

DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0); System.out.println(dateTime.plusDays(90).toString("E MM/dd/yyyy HH:mm:ss.SSS"));

在比如::距离 2000.1.1日 45 天之后的某天在下一个月的当前周的最后一天的日期。

DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0); System.out.println(dateTime.plusDays(45).plusMonths(1).dayOfWeek() .withMaximumValue().toString("E MM/dd/yyyy HH:mm:ss.SSS");

2.创建Joda-Time对象

//方法一:取系统时间点
DateTime dt1 = new DateTime();
System.out.println(dt1);

//方法二:通过java.util.Date对想生成
DateTime dt2 = new DateTime(new Date());
System.out.println(dt2);

//方法三:指定年月日时分秒生成
DateTime dt3 = new DateTime(2018,12,21,1,1,1);
System.out.println(dt3);

//方法四:ISO8601形式生成
DateTime dt4 = new DateTime("2012-05-20");
System.out.println(dt4);
DateTime dt5 = new DateTime("2012-05-20T13:14:00");
System.out.println(dt5);

//只需要年月日的时候
LocalDate localDate = new LocalDate(2015,12,21);
System.out.println(localDate);

//只需要十分秒毫秒的时候
LocalTime localTime = new LocalTime(12,30,26,0);
System.out.println(localDate);

3.与JDK日期对象转换 

有时候代码中使用的时Date与Calendar类,但是又需要一些复杂的时间日期算法,这个时候我们可以使用joda模块,然后再转化为代码中Date与Calendar类.

 1 DateTime dt = new DateTime();  2         
 3 //转换成java.util.Date对象
 4 Date d1 = new Date(dt.getMillis());  5 Date d2 = dt.toDate();  6         
 7 //转换成java.util.Calendar对象
 8 Calendar c1 = Calendar.getInstance();  9 c1.setTimeInMillis(dt.getMillis()); 10 Calendar c2 = dt.toCalendar(Locale.getDefault());

 

4.计算日期

         DateTime dt = new DateTime(); /** * yearOfCentury * dayOfYear * monthOfYear * dayOfMonth * dayOfWeek * minusDays * plusDays * ..... */
        //得到dt这一周的最小一天
 System.out.println(dt.dayOfWeek().withMinimumValue()); //得到dt减去6个月,然后再求那个月中的最大一天
        System.out.println(dt.minusMonths(6).dayOfMonth().withMaximumValue()); DateTime yesterday = dt.minusDays(1); DateTime tomorrow = dt.plusDays(1); DateTime before1month = dt.minusMonths(1); DateTime after3month = dt.plusMonths(3); DateTime before2year = dt.minusYears(2); DateTime after5year = dt.plusYears(5); //
        int year = dt.getYear(); //
        int month = dt.getMonthOfYear(); //
        int day = dt.getDayOfMonth(); //星期 
        int week = dt.getDayOfWeek(); //
        int hour = dt.getHourOfDay(); //
        int min = dt.getMinuteOfHour(); //
        int sec = dt.getSecondOfMinute(); //毫秒 
        int msec = dt.getMillisOfSecond(); //月末日期 
        DateTime lastday = dt.dayOfMonth().withMaximumValue(); //90天后那周的周一
        DateTime firstday = dt.plusDays(90).dayOfWeek().withMinimumValue(); //计算区间天数
        DateTime begin = new DateTime("2012-01-1"); DateTime end = new DateTime("2012-11-1"); Period period = new Period(begin, end,PeriodType.days()); System.out.println(period.getDays()); //计算特殊日期是否再该区间
        Interval interval = new Interval(begin, end); boolean contained = interval.contains(new DateTime("2012-2-29")); System.out.println(contained); //日期比较
        DateTime d1 = new DateTime("2012-02-01"); DateTime d2 = new DateTime("2012-05-01"); boolean b1 = d1.isAfter(d2); System.out.println(b1); //和系统时间对比
        boolean b2 = d1.isAfterNow(); System.out.println(b2);        

 

5.格式化日期

使用 JDK 格式化日期以实现打印是完全可以的,但是我始终认为它应该更简单一些。
这是 Joda 设计者进行了改进的另一个特性。要格式化一个 Joda 对象,调用它的 toString() 方法,
并且如果您愿意的话,传递一个标准的 ISO8601或一个 JDK 兼容的控制字符串,以告诉 JDK 如何执行格式化。
不需要创建单独的 SimpleDateFormat 对象
(但是 Joda 的确为那些喜欢自找麻烦的人提供了一个DateTimeFormatter 类)。
调用 Joda 对象的 toString() 方法,仅此而已。

DateTime dateTime = DateTime.now(); dateTime.toString("MM/dd/yyyy hh:mm:ss.SSSa"); dateTime.toString("dd-MM-yyyy HH:mm:ss"); dateTime.toString("EEEE dd MMMM, yyyy HH:mm:ssa"); dateTime.toString("MM/dd/yyyy HH:mm ZZZZ"); dateTime.toString("MM/dd/yyyy HH:mm Z");

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM