一、joda的优点展示

joda-time能够便捷地格式化时间输出、设定时间、加减时间、计算时间差值。跟JDK的Date/Calender相比一试便知,每个测试中上半部分是用jdk操作,下半部是用joda-time操作。最后一个我想……实在不想用jdk来实现:

public class JodaTimeTest {

@Test

public void testPrintDate(){

Date date = new Date();

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

String dateText = format.format(date);

Assert.assertEquals("2014-11-13", dateText);

DateTime dateTime = new DateTime();

dateText = dateTime.toString("yyyy-MM-dd");

Assert.assertEquals("2014-11-13", dateText);

}

@Test

public void testAddDate(){

Calendar calendar = Calendar.getInstance();

calendar.set(2008, Calendar.AUGUST, 8, 0, 0, 0);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E HH:mm:ss");

calendar.add(Calendar.DAY_OF_MONTH, 90);

String dateText = sdf.format(calendar.getTime());

Assert.assertEquals("2008年11月06日 星期四 00:00:00", dateText);

DateTime dateTime = new DateTime(2008,8, 8, 0, 0, 0, 0);

dateText = dateTime.plusDays(90).toString("yyyy年MM月dd日 E HH:mm:ss");

Assert.assertEquals("2008年11月06日 星期四 00:00:00", dateText);

}

@Test

public void testCalcDate(){

Calendar calendar = Calendar.getInstance();

calendar.set(2012, Calendar.DECEMBER, 20, 0, 0, 0);

calendar.add(Calendar.YEAR, 9);

calendar.add(Calendar.MONTH, 5);

calendar.add(Calendar.WEEK_OF_MONTH, 2);

calendar.add(Calendar.DAY_OF_MONTH, 7);

SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 E");

String dateText = df.format(calendar.getTime());

Assert.assertEquals("2022年06月10日 星期五", dateText);

LocalDate birthDate = new LocalDate(2012, 12, 20);

dateText = birthDate.plusYears(9).plusMonths(5).plusWeeks(2).plusDays(7).toString("yyyy年MM月dd日 E");

Assert.assertEquals("2022年06月10日 星期五", dateText);

}

@Test

public void testSomeDate(){;

LocalDate date = new LocalDate(1990, 10, 24);

int days = Days.daysBetween(date, new LocalDate()).getDays();

Assert.assertEquals(8786, days);

}

}

这三个是比较常见的操作,另外还可以用来计算本周是第几周、某天是星期几(我在生产环境中已使用的接口)等,其他api大家可以参考官网。

二、joda与long、Date、Calendar互转

与三者的互转十分简便,所以joda-time完全可以取代jdk中日期来运算,只要就结果再转换就行。

public class JodaTurnTest {

@Test

public void testJoda2Long(){

long time =  1415861538986L;

DateTime date = new DateTime(time);

Assert.assertEquals(time, date.getMillis());  //将时间粒度锁定在秒级别

}

@Test

public void  testJoda2Date(){

Date dateSource = new Date();

DateTime dateTime = new DateTime(dateSource);

Assert.assertEquals(dateSource.getTime(), dateTime.getMillis());

Date date2 = dateTime.toDate();

Assert.assertEquals(dateSource, date2);

}

@Test

public void testJoda2Calender(){

Calendar cal = Calendar.getInstance();

DateTime dateTime = new DateTime(cal);

Assert.assertEquals(cal.getTimeInMillis(), dateTime.getMillis());

Calendar calendar = dateTime.toGregorianCalendar();

Assert.assertEquals(cal, calendar);

}

}

三 、joda的概念

Instant:连续时间轴上的某个瞬间,即某时刻,采用UTC 1970年1月1日 00:00:00到目前时刻经历的毫秒数。与unix和jdk中的相同。 joda-time中主类Datetime就采用了Instant,这样就可以与JDK中date,calender交互了。

Partial:日常生活中的时间点,只是一个时间片段,如11点20分,再如9月20号。 Joda-timeAPI中LocalDate、LocalTime、LocalDateTime、YearMonth、MonthDay、Partial、YearMonthDay、TimeOfDay类都是这种概念。

Interval:表达的是两个时刻之间的区间段。如:

DateTime start = new DateTime(2004, 1, 1, 0, 0, 0, 0);

DateTime end = new DateTime(2005, 1, 1, 0, 0, 0, 0);

Interval interval = new Interval(start, end);

在Interval类接口中,可以得到开始、结束、是否包含等等

DateTime start = interval.getStart();

DateTime end = interval.getEnd();

DateTime testDate = new DateTime(2004, 2, 1, 0, 0, 0, 0);

boolean contains = interval.contains(testDate);

Duration:表示的目前的时刻再持续多久时间,与之前的Interval时间区间该概念类似,不过单位是毫秒。

DateTime start = new DateTime(1975, 5, 26, 0, 0, 0);

Duration oneThousandMillis = new Duration(1000);

DateTime end = start.plus(oneThousandMillis);

Period:与uration概念类似,不过单位不是毫秒,而是更人性化的单位,如年、月、日。这类的包括Period、MutablePeriod、Years、Months、Weeks、Days Hours、Minutes、Seconds等类。

DateTime start = new DateTime(1975, 5, 26, 0, 0, 0);

DateTime end = new DateTime(1978, 7, 23, 0, 0, 0);

Days days = Days.daysBetween(start, end);

四、joda与java8与date4j

java8中提供了新的日期API,而提供者正是Joda。可查看JSR310( https://jcp.org/en/jsr/detail?id=310)。

date4j是针对joda庞大类系与年表体系,而提供一套极简Api, 可查看( http://www.date4j.net/)。比较遗憾暂时还没有发现中国农历操作的api。

五、参考地址:

jodatime java8交互_Joda-time学习笔记相关推荐

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

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

  2. java8新特新学习笔记

    jdk8新特性内容概述 lambad表达式 函数式接口 方法引用与构造器引用 StreamAPI optinal类 jdk8新特性简介 jdk8(又称为java8)是java开发的一个主要版本.jdk ...

  3. 从零开始掌握交互设计的学习笔记

    @四四四毛 :最近两个月给公司的伙伴们做交互设计的分享,这是第一期分享的内容.在这次分享中,我认真梳理了交互设计师掌握和精通这门技艺的方法.我认为,如果想成为拔尖的设计师,只有这条路可走. 什么是交互 ...

  4. PHP学习笔记-PHP与JavaScript的交互

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51814192 本文出自:[顾林海的博客] 前言 前两篇笔记PHP学习笔 ...

  5. PHP学习笔记-PHP与Web页面的交互2

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51761308 本文出自:[顾林海的博客] 前言 在<PHP学习笔 ...

  6. 和php交互的过程_JavaScript学习笔记(二十三) 服务器PHP

    PHP PHP 一门后端语言 为什么要学习一个后端语言呢? 目前市场上的需求,要求前端人员掌握一个后端语言 方便和后端开发人员进行交互 基本组织架构 在讲后端语言之前,我们简单的了解一下我们基本的组织 ...

  7. Java8学习笔记(1) -- 从函数式接口说起

    转载自   Java8学习笔记(1) -- 从函数式接口说起 希望本文能够成为Java8 Lambda表达式的快速入门指南. 函数式接口 理解Functional Interface(函数式接口,以下 ...

  8. Vue学习笔记(三) —— 前后端交互

    简介 本文主要是为了介绍前端交互的相关知识,而严格来讲,这也不算是Vue的专属知识,但是却是必须要指定的.本文开始简单说了ajax.jquery 的方式,但是随着SPA开发模式的大火,相继出现了一些新 ...

  9. windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互

    windows内核开发学习笔记十七:IRP 和 IO_STACK_LOCATION 的交互 前面两篇学习笔记分别介绍了IRP和IO_STACK_LOCATION,整个设备栈来处理这个IRP,但是每个设 ...

最新文章

  1. python使用正则化检查字符串的起始和结束字符相同
  2. tnsping通oracle连不上,写正确了tnsnames文件却tnsping无法ping通
  3. Android之自定义瀑布流式的标签列表
  4. (0012) iOS 开发之MAC 终端命令学习
  5. 引:善用backtrace解决大问题
  6. 如何处理SAP Launchpad上tile打不开的问题
  7. 光纤收发器让网络布线变的更方便
  8. 云计算与分布式系统课程学习笔记(二)——Linux基本命令的使用与熟悉
  9. linux运维需要掌握的基础知识
  10. 带格式文本html 直接复制粘贴,通过JS将带格式的文本复制到剪贴版的两种方法...
  11. C#生成CHM文件(应用篇)之代码库编辑器(1)
  12. Android之远程图片获取和本地缓存
  13. Dorado 7 使用到的 注释
  14. IDL多进程批处理遥感数据
  15. U盘出现“请将磁盘插入U盘”的问题怎么解决?
  16. mac上如何彻底删除软件
  17. 你追逐梦想之前听到的十种谎言
  18. Origin绘图后导出图片的方法
  19. C语言中的EOF和feof()
  20. 怎么看计算机配置好不好,怎么看电脑配置好坏,详细教您怎么看电脑配置好坏...

热门文章

  1. 选品的差异化如何把握?通过产品差异化形成怎样优势?
  2. 9 使用AD滴泪与敷铜
  3. C++(常函数、常对象)
  4. “肆拾玖坊号”高铁冠名列车今日正式首发
  5. 红宝石、蓝宝石的主成份是什么?
  6. 机器学习算法 | Python实现k-近邻算法
  7. Excel_DATEDIF函数计算工龄、计算年假
  8. JDK8升至JDK11 新特性整理
  9. python和java和c语言的区别-python和c语言的主要区别总结
  10. python使用opencv模块画简单的图形