简介
说明
本文用示例来介绍LocalDateTime的用法。
相关网址
Java时间(JDK8)-LocalDate的使用 – 自学精灵
简述
从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().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()
指定时区
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 = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault())
指定时区
LocalDateTime ldt = Instant.ofEpochMilli(timestamp).atZone(ZoneOffset.ofHours(8)).toLocalDateTime(); LocalDateTime ldt = LocalDateTime.ofEpochSecond(timestamp/1000, 0, ZoneOffset.ofHours(8));
格式转换
格式大全见:Java时间(JDK8)-DateTimeFormatter的使用 – 自学精灵
格式化时间
LocalDateTime ldt = LocalDateTime.now(); String s1 = ldt.format(DateTimeFormatter.BASIC_ISO_DATE); String s2 = ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
解析
//默认采用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); //自定义格式进行解析 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime ldt4 = LocalDateTime.parse("2020-07-21 02:30:20", formatter);
比较时间
时间前后
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(ldt1.until(ldt2, 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方法有两个重载:
- LocalDateTime with(TemporalAdjuster adjuster)
- 可以通过TemporalAdjusters.xxx直接传参
- LocalDateTime with(TemporalField field, long newValue)
- 可以通过指定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年份更改为新值后的拷贝 |
请先
!