一、摘要
- Java8 Date/Time API相关的类:
LocalDate
,LocalTime
,LocalDateTime
,这三个类有一个公共特点就是同String
类一样,都是密封类(final
修饰),不允许继承(都位于java.time
包下) - Java8之前常用
SimpleDateFormat dateformat = new SimpleDateFormat(new Date());
的方式来格式化时间,程序中出现大量的SimpleDateFormat
类,既不简洁实用,造成代码臃肿,且可读性非常低 - Java8以前使用
new Date()
获取月时,从0
开始,每次都要+1
,获取本月最后一天,要分情况判断28
,29
,30
,31
,非常麻烦,代码量非常繁琐。Java8中的 Date/Time API 使得这些问题都解决了
二、获取当前日期
LocalDate
LocalDate.now();// 获取当前日期 format: yyyy-MM-dd 输出:2019-02-20
LocalTime
LocalTime.now(); // 获取当前时间 format: HH:mm:ss 输出:10:13:11.241
LocalDateTime
LocalDateTime.now(); // 获取当前日期时间 format: yyyy-MM-dd HH:mm:ss 输出:2019-02-20T10:13:11.241
三、LocalDate API
类方法
获取当前日期
LocalDate nowDate = LocalDate.now();// 输出 2019-02-20
自定义时间
LocalDate formatDate = LocalDate.parse("2019-01-01");// 输出 2019-01-01
实例方法
获取当天所属本月中的第几天
int dayOfMonth = nowDate.getDayOfMonth();// 输出 20
获取当天所属本年中的第几天
int dayOfYear = nowDate.getDayOfYear();// 输出 51
获取当天所属本周的周几
DayOfWeek dayOfWeek = nowDate.getDayOfWeek();// 输出 WEDNESDAY
int value = nowDate.getDayOfWeek().getValue();// 输出 3
获取当月所属本年的第几月,与new Date()
相比它是从1
开始,抛弃了之前的从0
开始
Month month = nowDate.getMonth();// 输出 FEBRUARY
int value = nowDate.getMonth().getValue();// 输出 2
int monthValue = nowDate.getMonthValue();// 输出 2
获取当前年份
int year = nowDate.getYear();// 输出 2019
获得此日期适用的时代
Era era = nowDate.getEra();// 输出 CE
获取本月第一天
LocalDate firstDayOfMonth= nowDate.with(TemporalAdjusters.firstDayOfMonth());// 输出 2019-02-01
获取本月第二天
LocalDate withDayOfMonth(int dayOfMonth)
: 返回此LocalDate
的副本,其中包含日期更改
LocalDate dayOfMonth = nowDate.withDayOfMonth(2);// 输出 2019-02-02
获取本月最后一天(无须再判断当月是28、29、30、31天)
LocalDate with(TemporalAdjuster adjuster)
: 返回此日期的调整副本
LocalDate lastDayOfMonth = nowDate.with(TemporalAdjusters.lastDayOfMonth());// 输出 2019-02-28
获取下一天日期
LocalDate plusDays(long daysToAdd)
: 返回此LocalDate
的副本,并添加指定的天数
LocalDate plusDays = nowDate.plusDays(1);// 输出 2019-02-21
获取下一周的今天
LocalDate plusWeeks(long weeksToAdd)
: 返回此LocalDate
的副本,并添加指定的周数
LocalDate plusWeeks = nowDate.plusWeeks(1);// 输出 2019-02-27
获取下一月的今天
LocalDate plusMonths(long monthsToAdd)
: 返回此LocalDate
的副本,并添加指定的月数
LocalDate plusMonths = nowDate.plusMonths(1);// 输出 2019-03-20
获取下一年的今天
LocalDate plusYears(long yearsToAdd)
: 返回此LocalDate
的副本,其中添加了指定的年数
LocalDate plusYears = nowDate.plusYears(1);// 输出 2020-02-20
注:TemporalAdjusters
类中有许多常用的特殊的日期的方法(类方法),详情可参照官网
四、LocalTime API
类方法
获取当前时间
LocalTime nowTime = LocalTime.now();// 输出 11:07:36.234
实例方法
构建自定义时间
// 方式一
LocalTime localTime = LocalTime.of(0, 0, 0);// 输出 00:00
// 方式二
LocalTime localTime2 = LocalTime.parse("13:00:00");// 13:00
获取小时数
int hour = nowTime.getHour();// 输出 11
获取分钟数
int minute = nowTime.getMinute();// 输出 9
获取秒数
int second = nowTime.getSecond();// 输出 36
获取纳秒数
int nano = nowTime.getNano();// 输出 443000000
五、LocalDateTime API
类方法
获取当前时间
LocalDateTime nowDateTime = LocalDateTime.now();// 输出 2019-02-20T11:16:49.426
使用自定义格式器DateTimeFormatter
替换了Java8之前的SimpleDateFormat
String nowDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"));// 输出 2019-02-20 11:17:35
六、java.time
包中提供的简单实用的方法(部分)
Clock
java.time.Clock
类使用时区提供对当前即时,日期和时间的访问
Clock
类使用时区来返回当前的纳秒时间和日期
Clock
可以替代System.currentTimeMillis()
和TimeZone.getDefault()
final Clock clock = Clock.systemUTC();
Instant instant = clock.instant();// 输出 2019-02-20T03:32:47.810Z
long millis = clock.millis();// 输出 1550633567860
LocalDate
java.time.LocalDate
类表示ISO-8601
日历系统中没有时区的日期,例如:2007-12-03
LocalDate
仅仅包含ISO-8601
日历系统中的日期部分;
LocalTime
则仅仅包含该日历系统中的时间部分。
这两个类的对象都可以使用Clock
对象构建得到
final LocalDate date = LocalDate.now();// 输出 2019-02-20
final LocalDate dateForClock = LocalDate.now(clock);// 输出 2019-02-20
LocalTime
java.time.LocalTime
类表示ISO-8601
日历系统中没有时区的时间,例如10:15:30
final LocalTime time = LocalTime.now();// 输出 11:36:47.735
final LocalTime timeForClock = LocalTime.now(clock);// 输出 11:36:47.735
LocalDateTime
java.time.LocalDateTime
类表示ISO-8601
日历系统中没有时区的日期时间,例如2007-12-03T10:15:30
final LocalDateTime datetime = LocalDateTime.now();// 输出 2019-02-20T11:38:36.831
final LocalDateTime datetimeForClock= LocalDateTime.now(clock);// 输出 2019-02-20T11:38:36.831
ZoneDateTime
java.time.ZonedDateTime
类表示ISO-8601
日历系统中具有时区的日期时间,例如:2007-12-03T10:15:30+01:00 Europe/Paris
final ZonedDateTime zonedDatetime = ZonedDateTime.now();// 输出 2019-02-20T11:40:20.808+08:00[Asia/Shanghai]
final ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now(clock);// 输出 2019-02-20T03:40:20.809Z
final ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));// 输出 2019-02-19T19:40:20.816-08:00[America/Los_Angeles]
Duration
java.time.Duration
类以秒和纳秒为单位模拟一个数量或时间量。可以使用其他基于持续时间的单位访问它,例如分钟和小时
final LocalDateTime startInclusive = LocalDateTime.of(2018, Month.FEBRUARY, 20, 0, 0, 0);
final LocalDateTime endExclusive = LocalDateTime.of(2019, Month.FEBRUARY, 20, 23, 59, 59);
final Duration duration = Duration.between(startInclusive, endExclusive);
long days = duration.toDays();// 输出 365
long hours = duration.toHours();// 输出 8783
long millis = duration.toMillis();// 输出 31622399000
long nanos = duration.toNanos();// 输出 31622399000000000
七、JDBC与Java8中的Date/Time关联
JDBC整合了Java8中的Date/Time API,将Java8中的Date/Time类型与数据库类型进行了映射,关系如下:
数据库类型 | Java类型 |
---|---|
date | LocalDate |
time | LocalTime |
timestamp | LocalDateTime |