java1.0中有一个Data类,不过由于它的功能有限,后来java1.1又增加了Calendar类,之后Data类中的大部分方法就被弃用了。但是,Calendar的API还不够给力,它的实例是易变的,边切没有处理诸如闰秒这样的问题,后来java8中引入了java.time API,即本文重点研究的内容,。
Instant与Duration
Instant表示时间线上的某个点,即某个时刻的时间。
Duration表示两个时刻之间的时间差
方法 | 描述 |
---|---|
plus/minus | 在当前Instant或Duration加上/减去一个Duration |
multipliedBy/dividedBy/negated | 返回由当前的Duration乘以/除以给定long/取反而得到的duration |
LocalDate
LocalDate是带有年、月、日的日期对象,可以使用静态方法now或of静态方法构建。
方法 | 描述 |
---|---|
now / of / parse | 从当前时间构建 / 从给定时间构建 / 解析字符串中的日期构建 LocalDate |
plusDays / plusWeeks / plusMonths / plusYears | 在当前LocalDate上加上一定的 天/星期/月/年 |
minusData / minusWeeks… … | plus 是加上一定时间,而minus 是减去一定时间 |
withDayOfMonth / withDayOfYear / withMonth / withYear | 根据给定的部分日期修改原有localDate值并返回 |
getDateOfWeek / getDateOfMonth / getDateOfYear | 获取星期日期/月的日期/年的日期 |
getMonth / getMonthValue | 获取Month的枚举值或月份的1~12数字 |
isBefore / isAfter | 两个LocalDate进行比较 |
until | 获取period,两个日期之间按照给定的chronoUnits比较计算的数值 |
isLeapYear | 判断是否是闰年 |
TemporalAdjusters类提供了大量调整日期的方法,计算诸如“每个月的一地个星期二”之类的日期非常容易,如某个月的一个星期二可以向下面这样计算:
LocalDate firstTuesday = LocalDate.of(year,month,1).with(
TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY)
);
方法 | 描述 |
---|---|
next(weekday)/previous(weekday) | 下一个/上一个给定的兴起日期 |
nextOrSame(weekday) / previousOrSame(weekday) | 从给定日期起下一个/上一个给定的星期日期 |
dayOfWeekInMonth(n,weekday) | 月份中第几个weekday |
lastInMonth(weekday) | 月份中最后一个weekday |
firstDayOfMonth() / firstDayOfNextMonth() / firstDayOfNextYear() / | 当月的第一日 / 下月的第一日 / 明年的第一日 |
LocalTime表示当日时刻,其挨批与LocalDate有些类似
ZonedDateTime
ZonedDateTime
表示时区时间,其对时间的操作与localDate中的方法类似
ZonedDateTime
对象的创建大致有如下几种:
- local.atZone(zoneId)
- ZonedDateTime.of(year,month,day,hour,minute,second,nano,zoneId)
instant.atZone(ZoneId.of(“UTC”))
注:
UTC代表“协调世界时间”,是不考虑夏令时的格林威治皇家天文台时间,ZoneId代表时区ID如America/New_York、Europe/Berlin
时间的解析与格式化
DateTimeFormatter
类提供了三种用于打印日期/时间值的格式器:
- 预定义的格式器
- Local相关的格式器
带有定制模式的格式器
部分预定义的格式器
格式器 | 描述 | 示例 |
---|---|---|
ISO_LOCAL_DATE | 2018-06-15, 13:32:00 | |
ISO_LOCAL_TIME | 2018-06-15T08, 13:32:00 | |
ISO_ORDINAL_DATE | LocalDate的年和该年的第几日 | 1969-166 |
RFC_1123_DATE_TIME | 用于邮件时间戳的标准,编篡与RFC822,并在RFC1123中将年份更改到4位 | web,16 jul 1969 09:32:00 -0500 |
要使用这些标准的格式器,可以直接调用其format方法:
String formatted = DateTimeFormatter.ISO_LOCAL_DATE .format(dateTime);
Local相关的格式化风格,可以将时间解析成AM、PM等时间格式
风格 | 日期 | 时间 |
---|---|---|
SHORT | 7/16/69 | 09:32 AM |
MEDIUM | Jul 16,1969 | 09:32:00 AM |
LONG | JulY 16,1969 | 09:32:00 AM EDT |
FULL | Wednesday,July 16,1969 | 09:32:00 AM EDT |
可以使用静态方法 ofLocalizedDate
、ofLocalizedTime
和ofLocalizedDateTime
创建这种格式器
例如:
DateTimeFormatter formatter = DateTimeFormatter .ofLocalizedDateTime(FormatStyle.LONG);
String formatted = formatter.format(dateTime);//JulY 16,1969 09:32:00 AM EDT
自定义日期格式
Formatter = DateFormatter.ofPattern("E yyyy-MM-dd HH:mm:ss a");//Web 1969-07-16 09:32:00 AM