目录
Joda Time是一个非常成功的日期和时间库,在过去12年左右的时间里,它被广泛使用并对许多应用程序产生了重要影响。但是,如果要将应用程序迁移到Java SE 8,那么就需要把Joda考虑迁移到Java.Time(以前称为JSR-310)了。
java.time库包含了从Joda time中学到的许多经验,包括更严格的空值处理和对多个日历系统的更好方法。
转换类型
不包括时区的类:
Joda-Time | java.time | Notes |
---|---|---|
LocalDate | LocalDate | 没有时间或时区的日期 |
YearMonthDay | ||
LocalTime | LocalTime | 没有日期或市区的时间 |
TimeOfDay | ||
LocalDateTime | LocalDateTime | 没有时区的日期+时间 |
MonthDay | MonthDay | 没有时区的月+日 |
YearMonth | YearMonth | 没有时区的年月 |
- | Year | 新 : 年份类 |
- | Month | 新 : 月份枚举 |
- | DayOfWeek | 新 : 星期几枚举 |
Partial | - | java.time中不存在 |
包含时区或表示毫秒的类:
Joda-Time | java.time | Notes |
---|---|---|
DateTime | ZonedDateTime | 有时区的日期+时间 |
OffsetDateTime | 新 : 格林威治/UTC的偏移日期+时间 | |
MutableDateTime | - | java.time中不包含,改用不可变的ZonedDateTime |
DateMidnight | - | 在Joda Time中不推荐使用LocalDate或ZonedDateTime |
- | OffsetTime | 新 : 格林威治/UTC的偏移时间 |
Instant | Instant | 日期时间连续体中的一个瞬间,指定为从1970-01-01T00:00Z开始的毫秒数。 |
DateTimeZone | ZoneId | 时区标识符,如欧洲/巴黎 Europe/Paris |
ZoneOffset | 新 : 与格林威治/UTC的偏移时间,例如+02:00 |
时间变量:
Joda-Time | java.time | Notes |
---|---|---|
Duration | Duration | 基于分秒的时间量 |
Period | Period and/or Duration | 时间量 Joda time Period包括年到毫秒,java.time仅年/月/日(另请参见(ThreeTen-Extra PeriodDuration) |
MutablePeriod | - | 不包含在java.time中,请改用不可变的Period或Duration |
Years | - | 不包含在java.time中,请改用Period(或ThreeTen-Extra) |
Months | ||
Weeks | ||
Days | ||
Hours | - | 不包含在java.time中,请改用Duration(或ThreeTen-Extra) |
Minutes | ||
Seconds | ||
Interval | - | java.time中不存在 (请参见 ThreeTen-Extra) |
MutableInterval | - | java.time中不存在 |
格式化:
Joda-Time | java.time | Notes |
---|---|---|
DateTimeFormatter | DateTimeFormatter | 不可变格式 |
DateTimeFormatterBuilder | DateTimeFormatterBuilder | 格式化构造器 |
DateTimeFormat | DateTimeFormatter | 基于DateTimeFormatter的静态方法 |
ISODateTimeFormat | ||
PeriodFormatter | - | java.time中不存在 (请参阅 ThreeTen-Extra ) |
PeriodFormatterBuilder | ||
PeriodFormat | ||
ISOPeriodFormat |
其他类和接口:
Joda-Time | java.time | Notes |
---|---|---|
- | Clock | 新 : 一种绕过标准时间的方式 |
Chronology | Chronology | 二者API和实现差别很大 |
ISOChronology | IsoChronology | 二者API和实现差别很大 |
DateTimeFieldType | ChronoField | 二者API和实现差别很大 |
DateTimeField | ||
DurationFieldType | ChronoUnit | 二者API和实现差别很大 |
DurationField | ||
PeriodType | - | java.time中不存在 |
Readable* | Temporal* | Readable*接口与Temporal*接口最接近, 强烈建议使用值类型,而不是临时接口 |
其他情况
在大多数情况下,上表足以确定要转换的类,所需的方法都是显而易见的。
以下是一些特殊情况:
- 舍入:Joda Time对舍入有相当大的支持,java.Time的支持较少,仅基于截断。请参见truncatedTo()方法。
- 月末:Joda Time在属性对象上使用withMaximumValue()方法将字段更改为月份的最后一天。java.time有一个更通用的机制,请参阅TemporalAdjusters.lastDayOfMonth()。
- Null:Joda Time接受null作为输入,并使用合理的默认值处理它。java.time拒绝输入null。
- Joda Time有一个构造函数,它接受Object并执行类型转换。java.time只有工厂方法,所以转换是一个用户问题,尽管为字符串提供了parse()方法。
- 时间间隔:Joda Time提供了金额类的方法,例如Days.between(a,b)。java.time在ChronoUnit类上提供了一个类似的方法——ChronoUnuit.DAYS.between(a,b)。
- 其他字段:Joda Time在DateTimeFieldType中提供了一组固定的字段。java.time允许通过实现TemporalUnit来扩展字段集,请参见IsoFields、JulianFields和WeekFields。
总结
本文概述了JavaSE8中JodaTime和java.Time之间的关键映射。对于Java.time不支持的部分可以使用ThreeTen-Extra 。