简介

说明

        本文用示例来介绍LocalDateTime的用法。


简述

从Java 8开始,java.time包提供了新的日期和时间API,主要涉及的类型有:

  • 本地日期和时间:LocalDateTime,LocalDate,LocalTime;
  • 带时区的日期和时间:ZonedDateTime;
  • 时刻:Instant;
  • 时区:ZoneId,ZoneOffset;
  • 时间间隔:Period, Duration。两个类表示两个日期或时间量之间的差

        DateTimeFormatter取代SimpleDateFormat。

        和旧API相比,新API严格区分时刻、本地日期、本地时间和带时区的日期时间,对日期和时间运算更加方便。

        此外,新API修正了旧API不合理的常量设计:

  • Month的范围用1~12表示1月到12月;
  • Week的范围用1~7表示周一到周日。
  • 最后,新API的类型几乎全部是不变类型(和String类似),可以放心使用不必担心被修改。

对应的SQL的类型

SQL -> Java

date -> LocalDate

time -> LocalTime

timestamp -> LocalDateTime

常用操作

注意:以下所有用法对于LocalDate和LocalTime是类似的。

创建

根据年、月、日、时、分、秒、纳秒等创建LocalDateTime

eg:
LocalTime zero = LocalTime.of(0, 0, 0); // 00:00:00
LocalTime mid = LocalTime.parse("12:00:00"); // 12:00:00
LocalTime now = LocalTime.now(); // 23:11:08.006

all method
LocalDateTime of(LocalDate date, LocalTime time)
LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute)
LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second)
LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute)
LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)
LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)

与Date转换

Date转换为LocalDateTime

Date date = new Date();
LocalDateTime nowDteTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

Date所在包:java.util.Date 

LocalDateTime转换为Date

LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());
Date date = Date.from(now.atZone(ZoneId.systemDefault()).toInstant());

与LocalDate/LocalTime转换

 转为LocalDate/LocalTime

LocalDateTime ldt = LocalDateTime.now();
LocalDate ld = ldt.toLocalDate();
LocalTime lt = ldt.toLocalTime();

与时间戳转换

LocalDateTime转时间戳

Long timestamp = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
Long timestamp = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();

toInstant(ZoneOffset.of("+8"))获得的是秒;toEpochMilli()是转为毫秒级 

时间戳转LocalDateTime

LocalDateTime ldt = Instant.ofEpochMilli(timestamp).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
LocalDateTime ldt = LocalDateTime.ofEpochSecond(timestamp/1000, 0, ZoneOffset.ofHours(8));

格式转换

格式化时间

LocalDateTime ldt = LocalDateTime.now();
String s1 = ldt.format(DateTimeFormatter.BASIC_ISO_DATE);
String s2 = ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm"));

解析

//默认采用ISO_LOCAL_DATE_TIME解析
LocalDateTime ldt1 = LocalDateTime.parse("2020-07-21T02:30:20");
//不指定秒也可以。但分必须指定。
LocalDateTime ldt2 = LocalDateTime.parse("2020-07-21T02:30");
LocalDateTime ldt3 = LocalDateTime.parse("2020-07-21T02:30:20", DateTimeFormatter.BASIC_ISO_DATE);

比较时间

 时间前后

LocalDateTime now = LocalDateTime.now();
LocalDateTime tomorrow = now.plusDays(1);
System.out.println(now.isBefore(tomorrow));
//true

时间差值

LocalDateTime ldt1 = LocalDateTime.now();
LocalDateTime ldt2 = LocalDateTime.now().plusHours(1);
System.out.println(ldt2.until(ldt1, ChronoUnit.HOURS)); //运行结果为-1

修改时间

时间增减

LocalDateTime ldt = LocalDateTime.now();
//两种写法
LocalDateTime ldt1 = ldt.plusYears(1);
LocalDateTime ldt2 = ldt.plus(1, ChronoUnit.YEARS);

通过with修改某些值

LocalDateTime ldt = LocalDateTime.now();                           //2020-07-30T09:41:24.761
LocalDateTime ldt1 = ldt.with(TemporalAdjusters.firstDayOfYear()); //2020-01-01T09:41:24.761
LocalDateTime ldt2 = ldt.with(ChronoField.YEAR, 2030); //2030-07-30T09:41:24.761
LocalDateTime ldt3 = ldt.withYear(2010); //2010-07-30T09:41:24.761

with方法有两个重载:

  1. LocalDateTime with(TemporalAdjuster adjuster)
  1. 可以通过TemporalAdjusters.xxx直接传参
  1. LocalDateTime with(TemporalField field, long newValue)
  1. 可以通过指定ChronoField.YEAR指定要修改的位置

其他

 LocalDateTime的toString是ISO_LOCAL_DATE_TIME格式

LocalDateTime now = LocalDateTime.of(2017, 9, 22, 15, 40, 00);
System.out.println(now); //执行结果:2017-09-22T15:40

获取当前时间

LocalDateTime now = LocalDateTime.now();
LocalDateTime now = LocalDateTime.now(ZoneId.systemDefault());

所有方法

(以下方法LocalDate与LocalTime也有,只是含义不一样而已)。以下加粗的都是static类型


方法



说明



adjustInto



调整指定的Temporal和当前LocalDateTime对



atOffset



结合LocalDateTime和ZoneOffset创建一个



atZone



结合LocalDateTime和指定时区创建一个ZonedD



compareTo



比较两个LocalDateTime



format



格式化LocalDateTime生成一个字符串



from



转换TemporalAccessor为LocalDateTime



get



得到LocalDateTime的指定字段的值



getDayOfMonth



得到LocalDateTime是月的第几天



getDayOfWeek



得到LocalDateTime是星期几



getDayOfYear



得到LocalDateTime是年的第几天



getHour



得到LocalDateTime的小时



getLong



得到LocalDateTime指定字段的值



getMinute



得到LocalDateTime的分钟



getMonth



得到LocalDateTime的月份



getMonthValue



得到LocalDateTime的月份,从1到12



getNano



得到LocalDateTime的纳秒数



getSecond



得到LocalDateTime的秒数



getYear



得到LocalDateTime的年份



isAfter



判断LocalDateTime是否在指定LocalDateTime



isBefore



判断LocalDateTime是否在指定LocalDateTime



isEqual



判断两个LocalDateTime是否相等



isSupported



判断LocalDateTime是否支持指定时间字段或单元



minus



返回LocalDateTime减去指定数量的时间得到的值



minusDays



返回LocalDateTime减去指定天数得到的值



minusHours



返回LocalDateTime减去指定小时数得到的值



minusMinutes



返回LocalDateTime减去指定分钟数得到的值



minusMonths



返回LocalDateTime减去指定月数得到的值



minusNanos



返回LocalDateTime减去指定纳秒数得到的值



minusSeconds



返回LocalDateTime减去指定秒数得到的值



minusWeeks



返回LocalDateTime减去指定星期数得到的值



minusYears



返回LocalDateTime减去指定年数得到的值



now



返回指定时钟的当前LocalDateTime



of



根据年、月、日、时、分、秒、纳秒等创建LocalDateTime



ofEpochSecond



根据秒数(从1970-01-0100:00:00开始)创建LocalDateTime



ofInstant



根据Instant和ZoneId创建LocalDateTime



parse



解析字符串得到LocalDateTime



plus



返回LocalDateTime加上指定数量的时间得到的值



plusDays



返回LocalDateTime加上指定天数得到的值



plusHours



返回LocalDateTime加上指定小时数得到的值



plusMinutes



返回LocalDateTime加上指定分钟数得到的值



plusMonths



返回LocalDateTime加上指定月数得到的值



plusNanos



返回LocalDateTime加上指定纳秒数得到的值



plusSeconds



返回LocalDateTime加上指定秒数得到的值



plusWeeks



返回LocalDateTime加上指定星期数得到的值



plusYears



返回LocalDateTime加上指定年数得到的值



query



查询LocalDateTime



range



返回指定时间字段的范围



toLocalDate



返回LocalDateTime的LocalDate部分



toLocalTime



返回LocalDateTime的LocalTime部分



toString



返回LocalDateTime的字符串表示



truncatedTo



返回LocalDateTime截取到指定时间单位的拷贝



until



计算LocalDateTime和另一个LocalDateTime差值



with



返回LocalDateTime指定字段更改为新值后的拷贝



withDayOfMonth



返回LocalDateTime月的第几天更改为新值后的拷贝



withDayOfYear



返回LocalDateTime年的第几天更改为新值后的拷贝



withHour



返回LocalDateTime的小时数更改为新值后的拷贝



withMinute



返回LocalDateTime的分钟数更改为新值后的拷贝



withMonth



返回LocalDateTime的月份更改为新值后的拷贝



withNano



返回LocalDateTime的纳秒数更改为新值后的拷贝



withSecond



返回LocalDateTime的秒数更改为新值后的拷贝



withYear



返回LocalDateTime年份更改为新值后的拷贝