Joda学习笔记
Joda Time简介
日常业务开发中,经常需要处理日期。比如:获取当前一个月之内的开播记录,获取十分钟之内的红包记录等等。我们之前是用java.util.Calendar实现的,直到我看到占小狼的文章->性能优化之抛弃Calendar,终于知道Joda这个好组件。用java.util.Date或者java.util.Calendar都比较繁琐。而Joda-Time 易于使用,管理,并且它提供了一组完整的功能。
Joda和Calendar的比较
- 创建某一时刻的时间对象
//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
Joda学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- Jmeter之CSS选择器/JQuery选择器关联
选择器: CSS选择器或JQuery选择器是Jmeter支持的两种语法,下面对其两种语法进行简单介绍 CSS选择器 JQuery选择器 Chrome - 复制CSS选择器 Google Chrome在 ...
- l命令练习题1
1.创建/guanli 目录,在/guanli下创建zonghe 和 jishu 两个目录(一条命令) [root@localhost ~]# mkdir -p /guanli/zonghe | mk ...
- go 学习之路(三)
一.strings和strconv使用 1.strings.HasPrefix(s string,prefix string) bool :判断字符串s是否以prefix开头 2.stings.Has ...
- Linux基础用户管理
一.用户管理 (一).用户和组的基本概念 Users and groups:. Every process (running program) on the system runs as a part ...
- k8s学习02-----kubeadm部署k8s
机器规划 系统配置 三台机器都执行 1.关闭selinux及firewalld sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux ...
- Java学习多线程第一天
内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...
- 佳木斯集训Day5
今天是ACM赛制...本来可以400的,结果毒瘤T2模拟硬生生卡掉了我90分 T1是个大水题,找规律,5分钟AC没啥压力 #include <bits/stdc++.h> #define ...
- asp.net core系列 69 Amazon S3 资源文件上传示例
一. 上传示例 Install-Package AWSSDK.S3 -Version 3.3.104.10 using Amazon; using Amazon.Runtime; using Ama ...
- 章节十五、9-自定义Loggers
一.如何给不同的包设置不同的日志级别? 1.针对不同的包来记录不同级别的日志信息 2.在日志xml配置文件中加入配置信息(红色标注) <?xml version="1.0" ...
- Intellij IDEA 2019.2 设置Git
点击File选择Settings 查找Git 选择Git安装路径bin目录下git.exe并点击text是否可用 选择OK安装完成. IDEA 拉去github 或 gogs上的项目(选择VCS —— ...