所有分类
  • 所有分类
  • 未分类

Java时间(JDK8)-LocalDateTime的使用

简介

说明

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

相关网址

Java时间(JDK8)-LocalDate的使用 – 自学精灵

Java时间(JDK8)-Period的使用 – 自学精灵

简述

从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方法有两个重载:

  1. LocalDateTime with(TemporalAdjuster adjuster)
    1. 可以通过TemporalAdjusters.xxx直接传参
  2. 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年份更改为新值后的拷贝

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录