java中做时间处理时一般会采用java.util.Date
,但是在Java 8中新增了对日期的处理类,包括java.time.LocalDate
、java.time.LocalTime
、java.time.LocalDateTime
等。
java.util.Date
和SimpleDateFormatter
都是线程不安全的,而LocalDate
和LocalTime
和最基本的String一样,是不变类型,不但线程安全,而且不能修改。
在Java 8中,日期和时间被明确划分为LocalDate
和LocalTime
,LocalDate
无法包含时间,LocalTime
无法包含日期。当然,LocalDateTime
才能同时包含日期和时间。
新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date
配合Calendar
要写好多代码。
获取实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| LocalDate localDate = LocalDate.now(); LocalTime localTime = LocalTime.now(); LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate2 = LocalDate.of(2018, 03, 18); LocalTime localTime2 = LocalTime.of(19, 18); LocalDateTime localDateTime2 = LocalDateTime.of(2018, 03, 18, 19, 18);
LocalDate localDate3 = LocalDate.parse("2018-03-18"); LocalTime localTime3 = LocalTime.parse("19:18");
|
一些方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| LocalDate today = LocalDate.now();
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth());
LocalDate tenDayOfThisMonth = today.withDayOfMonth(10);
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());
LocalDate lastDay = today.plusDays(1);
LocalDate firstMondayOfThisMonth = today.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
|
JDBC 映射
JDBC映射将把数据库的日期类型和Java 8的新类型关联起来:
1 2 3 4 5
| SQL -> Java -------------------------- date -> LocalDate time -> LocalTime timestamp -> LocalDateTime
|
LocalDateTime --> Date (使用默认时区)
1 2 3 4 5
| LocalDateTime localDateTime = LocalDateTime.now(); ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
Date date = Date.from(zonedDateTime.toInstant());
|
Date --> LocalDateTime (使用默认时区)
1 2 3
| Date date = new Date(); LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
|