Joda-Time令时间和日期值变得易于管理、操作和理解。事实上,易于使用是Joda的主要设计目标。其他目标包括可扩展性、完整的特性集以及对多种日历系统的支持。并且Joda与JDK是百分之百可互操作的,因此您无需替换所有Java代码,只需要替换执行日期/时间计算的那部分代码。
Maven依赖
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.8.2</version>
</dependency>
使用日期和时间类
以下五个日期-时间类将经常使用:
类名 | 含义 | 描述 |
---|---|---|
Instant | 即时——不可变类,代表在时间线上的一个瞬时点 | 使用一个事件的时间戳,没有日历系统或时区担心 |
DateTime | DateTime——不可变类,替代JDK日历 | 作为JDK日历类的通用替代,时区信息是很重要的 |
LocalDate | LocalDate——不可变类,代表一个地区的日期没有时间(没有时区) | 可以用来代表一个出生日期,是没有必要记录一天的时间信息 |
LocalTime | LocalTime——不可变类,代表一个地区的时间没有日期(没有时区) | 可以用来代表一天的某个时间,例:一个商店打开或关闭时间 |
LocalDateTime | LocalDateTime——不可变类,代表一个地区的日期和时间(没有时区) |
每个日期-时间类提供了各种构造函数。这些包含对象的构造函数,允许你基于不同的对象构建一个实例。例如,一个DateTime可以基于以下对象构造得到:
- Date - a JDK instant
- Calendar - a JDK calendar
- String - in ISO8601 format
- Long - in milliseconds
- Any Joda-Time date-time class
具体示例:
// Use a Date(or millisSecond)
java.util.Date juDate = new Date();
long timeInMillis = juDate.getTime();
DateTime dt = new DateTime(timeInMillis);
dt = new DateTime(juDate);
// Use a Calendar
java.util.Calendar c1 = Calendar.getInstance();
c1.set(Calendar.HOUR_OF_DAY, 0);
c1.set(Calendar.MINUTE, 0);
c1.set(Calendar.SECOND, 0);
c1.set(Calendar.MILLISECOND, 0);
dt = new DateTime(calendar);
// Use another Joda DateTime
DateTime anotherDateTime = obtainDateTimeSomehow();
dateTime = new DateTime(anotherDateTime);
// Use a String (must be formatted property)
String timeString = "2006-01-26T13:30:00-06:00";
dateTime = new DateTime(timeString);
timeString = "2006-01-26";
dateTime = new DateTime(timeString);
// 将Joda计算结果插入到JDK对象中
Calendar calendar = Calendar.getInstance();
DateTime dateTime = new DateTime(2000, 1, 1, 0, 0, 0, 0);
System.out.println(dateTime.dayOfWeek()
.toString("E MM/dd/yyyy HH:mm:ss.SSS");
calendar.setTime(dateTime.toDate());
Date date = dateTime.toDate();
从上面可以看出JDK的Date和Calendar对象,和Joda-Time的日期时间类相互转换是非常方便的。
每个日期-时间类提供了简单容易的方法来访问其字段。
// 例如,访问月份和年份,你可以使用:
DateTime dateTime = new DateTime(
2000, //year
1, // month
1, // day
0, // hour (midnight is zero)
0, // minute
0, // second
0 // milliseconds
);
int month = dt.getMonthOfYear(); // where January is 1 and December is 12
int year = dt.getYear();
所有主要的日期-时间类都是不可变的,当您通过一个 API 方法操作 Joda 类时,您必须捕捉该方法的返回值,因为您正在处理的实例不能被修改。就像 java.lang.String 创建后不能更改。然而,对于一个新创建的对象,我们提供了一些简单的方法来改变其字段值。
// 例如,设置年份或添加2个小时,你可以使用:
DateTime dt = new DateTime();
DateTime year2000 = dt.withYear(2000);
DateTime twoHoursLater = dt.plusHours(2);
除了基本的get方法,每个日期-时间类提供了属性1取每个字段的方法。这些提供丰富了Joda-Time功能。
//例如,访问一个月或一年详细信息:
DateTime dt = new DateTime();
String monthName = dt.monthOfYear().getAsText(); // 得到月份名
String frenchShortName =
dt.monthOfYear().getAsShortText(Locale.FRENCH); //月份的短法语名
boolean isLeapYear = dt.year().isLeap(); // 判断是否是闰年
DateTime rounded = dt.dayOfMonth().roundFloorCopy();
参考链接:官方指南 & Joda Time API & 透过他人的眼看世界
- 属性,它相当于Java对象的属性。属性是根据所表示的常见结构命名的,并且它被用于访问这个结构,用于完成计算目的。属性是实现Joda 计算威力的关键。例如:yearOfCentury,dayOfYear,monthOfYear,dayOfMonth,dayOfWeek。 ↩