强大易用的日期和时间库 Joda Time

作为一名开发者,我们不可避免的会使用日期API,如果您使用过JDK的API,或者您会发现JDK的API用的很别扭,尤其是在做日期运算和比较的时候,幸好我们活在开源的世界,也有其他朋友遇到同样的问题,因此joda-time就这样应运而生,jotat-time就是为了简化日期的操作而创建的一个开源项目,正如您期望中的那样,它极大的简化了日期的操作。

日期API的常用使用的几个方面主要有以下几个:

A.构造一个日期

B.对日期进行运算和比较

C.日期的格式化输出

A.构造一个日期

 

基于上面的API,您就可以方便的指定年月日、时分秒或者毫秒数来构建一个日期,但这里要重点关注的是第五个API:

public DateTime(Object
instant),这个构造函数传递一个Object对象,这个对象可以是以下几个类型:

ReadableInstant
String(可以被ISODateTimeFormat#dateTimeParser()解析的字符串)
Calendar
Date
(includes sql package subclasses)
Long (milliseconds,即距离 1970 年
1 月 1
日子时格林威治标准时间(也称为 epoch)以来的毫秒数)
null
(当前时间)

示例如下:

DateTime dateTime = new DateTime(new Date());

DateTime dateTime = new
DateTime(Calendar.getInstance());

DateTime dateTime = new
DateTime("2012-05-30T10:23:1");

B.对日期进行运算和比较

也许joda的构造函数只是简单的API调用,但对于日期的运算和比较,则是joda的强大之处,也是我们平时使用最多的方面:

下面用一个例子来演示joda的强大之处:

计算11月中第一个星期一之后的第一个星期二

DateTime dateTime = new
DateTime().monthOfYear()
     .setCopy(11)
// November
     .dayOfMonth() // Access Day
Of Month Property
     .withMinimumValue()
// Get its minimum value
     .plusDays(6)
// Add 6 days
     .dayOfWeek() // Access
Day Of Week Property
     .setCopy("星期一") //
Set to Monday (it will round down)
    
.plusDays(1); // Gives us Tuesday

上面的一段代码中,第3行有一段dayOfMonth()的调用,joda称之为属性,类似于java的属性,基于这个属性,我们可以调用joda的API做一些日期的增减,获取最大最小值等操作。

再看代码第七行 .setCopy("星期一"),它是整个计算的关键,这样的话,在每月的开始再加上 6
天就能够让您得到第一个星期一。再加上一天就得到第一个星期二。这里使用参数 “星期一”
是和Locale相关的,建议可以使用1替换,如果您在美国地区,这个参数就需要设置为"Monday"

计算2个日期的时间差,例如获取2个时间相差多少天:
int
days = Days.daysBetween(DateTime.now(), new
DateTime("2012-05-30T10:23:1")).getDays();

Joda
使得执行日期计算变得非常容易,这就是joda的强大之处,想想要是使用jdk的日期API,得要多少步骤才能完成上面的功能。

对于日期比较,joda-time也提供了一些API去进行常用日期比较,如:

C.日期的格式化输出

Joda的日期格式化提供了简单的API接口:toString(),如果你需要的话,也可以传一个ISO-8601或者一个JDK控制的字符串格式,来告诉API如何输出日期格式

1.使用ISO-8601
DateTime dateTime = new
DateTime();
System.out.println(dateTime.toString(ISODateTimeFormat.basicDateTime()));
System.out.println(dateTime.toString(ISODateTimeFormat.basicDateTimeNoMillis()));

System.out.println(dateTime.toString(ISODateTimeFormat.basicWeekDateTime()));

以上代码输出:
20130516T192141.859+0800
20130516T192141+0800

2013W204T192141.859+0800

2.使用SimpleDateFormat字符串

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

以上代码输出:

16-05-2013 19:25:12

星期四 16 五月, 2013 19:25:12下午

05/16/2013 19:25 Asia/Shanghai

05/16/2013 19:25 +0800

具体格式可以查看javadoc:DateTimeFormat

D.Joda与JDK相互转换

 

joda是为了简化日期的开发,于是它也提供了对JDK日期的相互转换的API,这样您可以方便的切换日期的使用。

DateTime dateTime = new DateTime(new Date());

DateTime dateTime = new
DateTime(Calendar.getInstance());

Date jdkDate = DateTime.now().toDate();

同时,JDK的日期API和joda都提供了获取毫秒数和通过毫秒数创建日期,也就是基于毫秒数这个桥梁,我们也可以进行互转

new DateTime(new Date().getTime())

new Date(DateTime.now().getMillis());

就是这么简单,您可以方便的互相转换,以进行您的日期计算。

总结:

joda-time是一个轻量级的开源项目,用过jdk自带的日期API,再对比joda-time,你会发现两者在用户使用方面的巨大差异,如果您用过joda-time,相信您再也不会再想用JDK的日期API

文章来源:

http://www.cnblogs.com/cm4j/archive/2013/05/16/cm4j.html

时间: 2024-10-22 20:26:59

强大易用的日期和时间库 Joda Time的相关文章

强大易用的日期和时间库 线程安全 Joda Time

https://www.ibm.com/developerworks/cn/java/j-jodatime.html 不可变性 我在本文讨论的 Joda 类具有不可变性,因此它们的实例无法被修改.(不可变类的一个优点就是它们是线程安全的) Joda-Time提供了一组Java类包用于处理包括ISO8601标准在内的date和time.可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成. Joda-Time主要的特点包括: 1. 易于使用:Calendar让获取

Java 日期、时间类

Java 原本提供了 Date 和 Calendar 用于处理日期.时间的类,包括创建日期.时间对象,获取系统当前日期.时间等操作.但 Date 不仅无法实现国际化,而且它对不同属性也使用了前后矛盾的偏移量,比如月份与小时都是从0开始的,月份中的天数则是从1开始的,年又是从1900开始的,而 java.util.Calendar 则显得过于复杂,从下面介绍中会看到传统 Java 对日期.时间处理的不足.Java8 吸取了 Joda-Time 库(一个被广泛使用的日期.时间库)的经验,提供了一套全

日期与时间

一.PHP日期和时间库 验证日期:checkdate(月,日,年)函数能够很好地验证日期,提供的日期如果有效,则返回true,否则返回false. <?php if (checkdate(2,29,2007)) { echo '日期合法'; } else { echo '日期不合法'; } ?> 格式化时间和日期:date()函数返回根据预定义指令格式化时间和日期的字符串形式.所有格式参数,可以参考手册. <?php echo date('Y-m-d H:i:s');  //直接输入日期

PHP 日期和时间

PHP date() 函数用于对日期或时间进行格式化. PHP Date() 函数 PHP Date() 函数把时间戳格式化为更易读的日期和时间. 语法 date(format,timestamp) 注释:时间戳是一种字符序列,它表示具体事件发生的日期和事件. 获得简单的日期 date() 函数的格式参数是必需的,它们规定如何格式化日期或时间. 下面列出了一些常用于日期的字符: d - 表示月里的某天(01-31) m - 表示月(01-12) Y - 表示年(四位数) 1 - 表示周里的某天

日期和时间(10)

UNIX时间戳 PHP的日期和时间库 验证日期 格式化日期和时间 将时间戳转换用户友好的值 处理时间戳 日期函数 显示本地化的日期和时间 显示网页的最新修改日期 确定当前月份的天数 确定任意给定月份的天数 计算当前日期后X天的日期 DataTime构造函数简介 格式化日期 实例化后设置日期 实例化后设置时间 修改日期和时间 计算两个日期之差 原文地址:https://www.cnblogs.com/xiukang/p/8569894.html

java8新特性之 日期和时间

在Java 8以前,日期和时间处理一直被广大java程序员抱怨太难用,java.util和java.sql中,都包含Date类,如果要进行时间格式化,还需要java.text.DateFormat类处理.同时java.util.Date中既包含了日期,又包含了时间,所以java8新的日期和时间库,很好的解决了以前日期和时间类的很多弊端.并且也借鉴了第三方日期库joda很多的优点. java.time包下主要包含下面几个主要的类: Instant:时间戳 Duration:持续时间,时间差 Loc

【Java基础08】内部类、枚举类、日期和时间、Math、Random

1 内部类 1.1 概念 大部分时候,类被定义成一个独立的程序单元,在某些情况下,也会把一个类放到另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类被称为外部类. 1.2 作用 1.提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类. 2.内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相访问.但外部类不能访问内部类的实现细节,例如内部类的成员变量. 3.匿名内部类适合用于创建那些仅需要一次使用的类

js非常强大的日历控件fullcalendar.js, 日期时间库: moment.js

日历控件: https://fullcalendar.io/docs/ https://fullcalendar.io/docs/event_data/events_function/ https://fullcalendar.io/docs/event_data/Event_Object/ https://fullcalendar.io/docs/mouse/eventClick/ <!DOCTYPE html> <html> <head> <meta char

Python工具 | 10个用于处理日期和时间的 Python 库

1??arrow 更好的 Python 日期时间操作类库. 官网 2??Chronyk Python 3 的类库,用于解析手写格式的时间和日期. GitHub 3??dateutil Python datetime 模块的扩展. GitHub 4??delorean 解决 Python 中有关日期处理的棘手问题的库. 官网 5??maya 人性化的时间处理库. GitHub 6??moment 一个用来处理时间和日期的 Python 库.灵感来自于?Moment.js. GitHub 7??pe