Java日期及时间库插件 -- Joda Time.

转载自   Java日期及时间库插件 -- Joda Time.

来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用的都是JDK原生的时间处理API, 大家都知道Java原生的时间处理的API一直都是不太好用, 所以这个有必要去学习下, 去总结下.
来到新公司学到的东西挺多的, 比如我们用了Guava, ElasticSearch, kafka/mns/ons, GuavaCache/Ehcache/Memcahe .... 等很多东西都是我以前没有接触过的. 所以待我学习的东西还有很多. 每天都是怀着激动的心情, 去汲取更多的知识. 说了这么多屁话, 开始总结了.

一: 使用示例 

因为双十一就快到了, 所以接触了一个秒杀的活动, 其中有这么一块代码: 

/*** 检查抽奖时间** @return true 可以抽奖 false 不能抽奖*/private boolean checkDrawTime() {return DateTime.parse("2016-11-11 11:11:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).isBeforeNow();}

这个方法很简单, 就是检查现在的时间是不是2016/11/11 11:11:00 之前. 当然这里的DateTime是Jode Time里的类.
查看源码可以知道, DateTime.parse就是将输入的时间转换为后面的格式, 转换的结果为:


然后再用isBeforeNow方法来比较, 下面看下这个方法具体的做法:

public boolean isBeforeNow() {return this.isBefore(DateTimeUtils.currentTimeMillis());
}public boolean isBefore(long var1) {return this.getMillis() < var1;
}

这样看过来是不是很清楚了, 当然Java 自带的JDK也是可以完成的, 但是Joda Time都给我封装好了, 用起来就更加简单了.

接下来看看更多的例子:

1、创建任意时间对象

//jdk
Calendar calendar=Calendar.getInstance();
calendar.set(2012, Calendar.NOVEMBER, 15, 18, 23,55);//Joda-time
DateTime dateTime=new DateTime(2012, 12, 15, 18, 23,55);

2、计算两日期相差的天数

//jdkCalendar start = Calendar.getInstance(); start.set(2012, Calendar.NOVEMBER, 14);Calendar end = Calendar.getInstance();end.set(2012, Calendar.NOVEMBER, 15);long startTim = start.getTimeInMillis();long endTim = end.getTimeInMillis();long diff = endTim-startTim;int days=(int) (diff/1000 / 3600 / 24);//joda-timeLocalDate start=new LocalDate(2012, 12,14);LocalDate end=new LocalDate(2012, 12, 15);int days = Days.daysBetween(start, end).getDays();

3、获取18天之后的某天在下个月的当前周的第一天日期

//jdk
Calendar current = Calendar.getInstance();
current.add(Calendar.DAY_OF_MONTH, 18);
current.add(Calendar.MONTH, 1);......
DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = current.getTime();
String dateStr = dateFormat.format(date);
System.out.println(dateStr);//joda-time
String dateStr = new DateTime().plusDays(18).plusMonths(1).dayOfWeek().withMinimumValue().toString("yyyy-MM-dd HH:mm:ss");
System.out.println(dateStr);

4、时间格式化

DateTimeFormatter format = DateTimeFormat .forPattern("yyyy-MM-dd HH:mm:ss");//时间解析
DateTime dateTime = DateTime.parse("2012-12-21 23:22:45", format);//时间格式化,输出==> 2012/12/21 23:22:45 Fri
String string_u = dateTime.toString("yyyy/MM/dd HH:mm:ss EE");
System.out.println(string_u);//格式化带Locale,输出==> 2012年12月21日 23:22:45 星期五
String string_c = dateTime.toString("yyyy年MM月dd日 HH:mm:ss EE",Locale.CHINESE);
System.out.println(string_c);

5、与JDK互操作

//通过jdk时间对象构造
Date date = new Date();
DateTime dateTime = new DateTime(date);Calendar calendar = Calendar.getInstance();
dateTime = new DateTime(calendar);// Joda-time 各种操作.....
dateTime = dateTime.plusDays(1) // 增加天.plusYears(1)// 增加年.plusMonths(1)// 增加月.plusWeeks(1)// 增加星期.minusMillis(1)// 减分钟.minusHours(1)// 减小时.minusSeconds(1);// 减秒数// 计算完转换成jdk 对象
Date date2 = dateTime.toDate();
Calendar calendar2 = dateTime.toCalendar(Locale.CHINA)


二: api简介

Maven项目组中引入Joda Time坐标地址:

<!-- joda -->
<dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.3</version>
</dependency>

1, 日期和时间:
Joda-time里面的时间全都是不可变的,也就是不可变性。

DateTime :类似于JDK中的Calendar,提供了更多的方法。
DateMidnight :这个概念稍微复杂,封装某个时区(通常为默认时区)在特定年/月/日的午夜时分的时刻。它基本上类似于 
DateTime,不同之处在于时间部分总是为与该对象关联的特定 
DateTimeZone 时区的午夜时分。
LocalDate :无时间的类,只包含年月日。(不包含时区)
LocalTime :无日期的类,只包含时间。(不包含时区)
LocalDateTime :包含日期和时间。(不包含时区)

下面举一些简单的例子说明Joda-time的强大之处:

//获取当前月份:
DateTime dt = new DateTime();
int month = dt.getMonthOfYear();
//设定2000年/获取当前小时+2的小时:
DateTime dt = new DateTime();
DateTime year2000 = dt.withYear(2000);
DateTime twoHoursLater = dt.plusHours(2);
System.out.println(year2000.getYear());
System.out.println(twoHoursLater.getHourOfDay());
//以及下面的一些操作:
String monthName = dt.monthOfYear().getAsText();
String frenchShortName = dt.monthOfYear().getAsShortText(Locale.FRENCH);
boolean isLeapYear = dt.year().isLeap();
DateTime rounded = dt.dayOfMonth().roundFloorCopy();
System.out.println(monthName); // 本地月份名称
System.out.println(frenchShortName); // 法语月份简称
System.out.println(isLeapYear); // 是否闰年
System.out.println(rounded); // 获取当天0:0:0的DateTime对象


2, 日历系统及时区

Joda-time支持多种年表(即日历系统)及所有时区。主要的两个类如下:
Chronology :年表,Joda-time支持很多年表。就像JDK有Calendar,也有GregorianCalendar。
DateTimeZone :时区。

示例如下,一般系统都没有这个需求。

Chronology coptic = CopticChronology.getInstance();
System.out.println(coptic); // CopticChronology[Asia/Shanghai]DateTimeZone zone = DateTimeZone.forID("Asia/Tokyo");
Chronology gregorianJuian = GJChronology.getInstance(zone);
System.out.println(gregorianJuian); // GJChronology[Asia/Tokyo]

3, 时间跨度

Joda-time支持的时间跨度有三个,分别如下:
Interval :根据开始、结束时间表示一个特定的时间跨度。其为半开区间,即包括起始时刻,不包含结束时刻。
Period :Period设定了一些特定的时间跨度,比如小时、天、月。
Duration :表示绝对的精准跨度,以毫秒为单位。

使用示例如下:

DateTime beginDateTime = new DateTime(2010, 1, 1, 0, 0, 0);
DateTime endDateTime = new DateTime(2015, 1, 1, 0, 0, 0);
Interval interval = new Interval(beginDateTime, endDateTime);
System.out.println(interval.containsNow()); // 是否包含当前时间
System.out.println(interval.toDurationMillis()); // 时间间隔毫秒数DateTime dt = new DateTime(2005, 3, 26, 12, 0, 0, 0);
DateTime plusPeriod = dt.plus(Period.days(1));
System.out.println(plusPeriod); // Period的方式+1天
DateTime plusDuration = dt.plus(new Duration(24L * 60L * 60L * 1000L));
System.out.println(plusDuration); // Duration的方式+1天

三: 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 的操作。默认时间,即从运行代码的机器的系统时钟检索到的时间,在大部分情况下被使用。

好了, 我所了解的就是这么多, 我主要还是从如何使用的角度去学习这个东西, 最后总结了它的几个特性, 当然Joda-Time的强大之处远不止这些, 大家在以后的工作中可以尝试着去使用它. 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电商校招指导

https://www.imooc.com/article/19998 https://www.imooc.com/article/18998 鼓励大家多总结 有道笔记可以记录下来 多年总结的 平时要多总结 https://www.imooc.com/article/19094 温馨tips&#xff1a; 校招的要求会比社招低很多&#xff0c;大家要把握好机会。因为校招…

大咖开讲:一小时学会.NET MVC开发的那些事儿

许多ASP.NET开发人员开始接触MVC认为MVC与ASP.NET完全没有关系&#xff0c;是一个全新的Web开发&#xff0c;事实上ASP.NET是创建WEB应用的框架&#xff0c;而MVC是能够用更好的方法来组织并管理代码的一种更高级架构体系。我们可将原来的ASP.NET称为ASP.NET Webform&#xff0…

HashMap的实现原理及其特点

HashMap的实现原理及其特点 2018年03月15日 20:43:08 阅读数&#xff1a;11045更多 个人分类&#xff1a; Java基础知识点 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/lovewebeye/article/details/79573702 1) Hash…

重写equals就必须重写hashCode的原理分析

转载自 重写equals就必须重写hashCode的原理分析因为最近在整理Java集合的源码&#xff0c; 所以今天再来谈谈这个古老的话题&#xff0c;因为后面讲HashMap会用到这个知识点&#xff0c; 所以重新梳理下。如果不被重写&#xff08;原生Object&#xff09;的hashCode和equals是…

mysql unique count_MySQL - Count Number of Unique Values

问题If I have three columns:orderNumber, name, emailand I would like to count how many unique emails are in the table how would I go about doing so?A statement like:SELECT count(email) FROM ordersgives me the total count.I tried SELECT DISTINCT count(emai…

如何在 ASP.NET MVC 中集成 AngularJS(2)

在如何在 ASP.NET MVC 中集成 AngularJS(1)中&#xff0c;我们介绍了 ASP.NET MVC 捆绑和压缩、应用程序版本自动刷新和工程构建等内容。 下面介绍如何在 ASP.NET MVC 中集成 AngularJS 的第二部分。 ASP.NET 捆绑和压缩 CSS 和 JavaScript 的捆绑与压缩功能是 ASP.NET MVC 最流…

bean交个spring和new比较区别

在spring的配置文件中我们要使用DataSource这个对吧 这个bean将会被多个bean引用 通过ref"dateSource"这个引用 当我们要修改这个只要修改引用就好了 不需要修改很多了 主要是解耦 比如你有一个A类 在好几个类里边要调用到A的方法 new的话就要在每个类里都new…

什么是中间件

转载自 什么是中间件什么是中间件&#xff1f; 中间件就是程序中可织入的&#xff0c;可重用的&#xff0c;与业务逻辑无关的各种组件。中间件&#xff08; middleware &#xff09;是基础软件的一大类&#xff0c;属于可复用软件的范畴。顾名思义&#xff0c;中 间件处于操作…

guid判断是否有效_让我们一起啃算法----有效的括号

有效括号&#xff08;Valid-Parentheses&#xff09;题干如下&#xff1a;给定一个只包括 ‘(‘&#xff0c;’)’&#xff0c;’{‘&#xff0c;’}’&#xff0c;’[‘&#xff0c;’]’ 的字符串&#xff0c;判断字符串是否有效。有效字符串需满足&#xff1a;1.左括号必须用…

小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?

转载自 小白科普&#xff1a;从输入网址到最后浏览器呈现页面内容&#xff0c;中间发生了什么&#xff1f; 1、前言 这篇文章是应网友之邀所写&#xff0c;主要描述一下我们访问网站时&#xff0c; 从输入网址到最后浏览器呈现内容&#xff0c;中间发生了什么。 之前写过两…

面试官角度的JVM面试

一个面试官对JVM面试问题的分析 2017年02月19日 21:51:34 阅读数&#xff1a;18135 标签&#xff1a; 面试官JVM面试问题分析 更多 个人分类&#xff1a; JVM 这个帖子的背景是今晚看到je上这张贴&#xff1a;http://www.iteye.com/topic/715256&#xff0c;心血来潮写下的文…

如何在 ASP.NET MVC 中集成 AngularJS(3)

今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容。 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后&#xff0c;我意识到&#xff0c;我必须提供两个版本的路由表&#xff1a;一个运行在调试模式的应用程序下和一个运行在发布模式的应用程…

小菜:关于main方法的面试题

转载自 小菜&#xff1a;关于main方法的面试题问题&#xff1a;如果main方法被声明为private会怎样&#xff1f; 答案&#xff1a;能正常编译&#xff0c;但运行的时候会提示“main方法不是public的”。问题&#xff1a;如果去掉了main方法的static修饰符会怎样&#xff1f; 答…

kali linux改中文_kali linux 2019.4设置为中文方法

就在前天&#xff0c;2019年11月26日&#xff0c;kali Linux官网发布了最新版本&#xff1a;Kali Linux 2019.4发行版&#xff0c;此版本和之前相比变动很大&#xff0c;系统界面、主题、壁纸都灿然一新。Kali Linux2019.4版本包括了一些令人兴奋的新更新:一个新的默认桌面环境…

构建高可用ZooKeeper集群

ZooKeeper 是 Apache 的一个顶级项目&#xff0c;为分布式应用提供高效、高可用的分布式协调服务&#xff0c;提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。由于 ZooKeeper 便捷的使用方式、卓越的性能和良好的稳定性&#xff0c…

面试官角度弹面试

http://www.iteye.com/topic/715304 这个帖子的背景是今晚看到je上这张贴&#xff1a;http://www.iteye.com/topic/715256&#xff0c;心血来潮写下的文字&#xff0c;如果能抛砖引玉&#xff0c;能有其他面试官分析一下自己面试时问的问题&#xff0c;那或许是件很有意义的事…

面试经历—广州YY(欢聚时代)

转载自 面试经历—广州YY&#xff08;欢聚时代&#xff09; 上周去YY&#xff08;欢聚时代&#xff09;面试JAVA工程师&#xff0c;现在回忆一下当时的面试过程&#xff0c;面试问的问题有&#xff1a;1、常用的集合类HashMap、HashTable、ArrayList、LinkedList、HashSet2、…

mysql binlog 备份恢复数据_Mysql结合备份+binlog恢复误删除操作数据

结合备份binlog恢复数据。场景&#xff1a;昨天晚上做了全备&#xff0c;今天上午用户不小心误删除某张表。解决方案&#xff1a;不建议在原生产环境直接恢复&#xff0c;建议在另一台机器恢复全库日志&#xff0c;然后导入到生产环境。1) 创建表select now();create table itp…

你们也只剩下点赞的交情

作者|北及企鹅 微信|叁禁 01 你们有没有这样的朋友&#xff0c;他们在你的世界里扮演着退化的角色。 也许友谊的开始只是小学一年级的时候他对你说了一声“我也喜欢看小丸子。”你们就手拉手肩并肩当了很久的密友。 也许是因为初中那次你俩都没交作业一起在楼道罚站&#xff0…

IBM® Bluemix 上运行ASP.NET Core

IBM Bluemix 上的“ASP.NET 核心”运行时采用“ASP.NET 核心”buildpack 技术。“ASP.NET 核心”是用于构建 .NET Web 应用程序的模块化开放式源代码框架。“.Net 核心”是跨平台的小型运行时&#xff0c;可由“ASP.NET 核心”应用程序实现。将它们相结合可实现基于云的先进 We…