Java8新特性之Date/Time API应用详解

一、摘要

  1. Java8 Date/Time API相关的类:LocalDateLocalTimeLocalDateTime,这三个类有一个公共特点就是同String类一样,都是密封类(final修饰),不允许继承(都位于java.time包下)
  2. Java8之前常用SimpleDateFormat dateformat = new SimpleDateFormat(new Date());的方式来格式化时间,程序中出现大量的SimpleDateFormat类,既不简洁实用,造成代码臃肿,且可读性非常低
  3. Java8以前使用new Date()获取月时,从0开始,每次都要+1,获取本月最后一天,要分情况判断28293031,非常麻烦,代码量非常繁琐。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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章