JDK8 日期类使用详解

目录

LocalDate、LocalDateTime、LocalTime

获取当前时间

设置指定的时间

获取年/月/日

设置时间/日期(绝对值)

设置偏移量

Instant

now()

添加偏移量(时区)

获取时间戳(从1970年1月1日0时0分0秒开始的毫秒数)

根据毫秒时间戳返回Instant对象

DateTimeFormatter

ofPattern

format格式化为字符串

parse解析为时间/日期

Period

Duration

计算日期绝对间隔

常用日期获取

String、Date、LocaDate、LocalTime、LocalDateTime 相互转换

String 与 Date相互转换

String 与 LocaDate相互转换

String 与 LocaTime相互转换

String 与 LocalDateTime相互转换

Date 与 LocalDate相互转换

Date 与 LocalTime 转换

Date 与 LocalDateTime相互转换

LocalDate 与 LocalDateTime相互转换

LocalTime 与 LocalDateTime转换

LocalDateTime与Long转换


Java8 中吸收了Joda-Time的精华,以一个新的开始为Java创建优秀的API。新的java.time中包含了所有关于本地时间(LocalDate)、本地时间(LocalTIme)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。下面简单介绍其使用方法。

LocalDate、LocalDateTime、LocalTime

获取当前时间

//获取当前时间  now()/now(ZoneId zone) 
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();

输出:
2021-07-03
20:09:18.472
2021-07-03T20:09:18.472

设置指定的时间

//of(): 设置指定的年、月、日、时、分、秒。没有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 8, 1, 1, 1);
输出:
2020-10-08T01:01:01

//获取一天中小时间和最大时间
LocalDate localDate = LocalDate.now();
ystem.out.println(localDate);
LocalDateTime min = LocalDateTime.of(localDate, LocalTime.MIN);
System.out.println(min);
LocalDateTime max = LocalDateTime.of(localDate, LocalTime.MAX);
System.out.println(max);

输出:
2021-09-26
2021-09-26T00:00
2021-09-26T23:59:59.999999999

获取年/月/日

//getXxx()
System.out.println(localDateTime.getDayOfMonth());
System.out.println(localDateTime.getDayOfWeek());    //枚举
System.out.println(localDateTime.getMonth());        //枚举
System.out.println(localDateTime.getMonthValue());
System.out.println(localDateTime.getMinute());

输出:
3
SATURDAY
JULY
7
9

设置时间/日期(绝对值)

//设置时间/日期  withDayOfMonth()/withDayOfYear()/withMonth()/withYear()
LocalDate localDate1 = localDate.withDayOfMonth(5);  //设置为本月第5天
System.out.println(localDate);   // 不可变
System.out.println(localDate1);

输出:
2021-07-03
2021-07-05

设置偏移量

// 设置偏移量
LocalDateTime localDateTime3 = localDateTime.plusDays(3);
LocalDateTime localDateTime4 = localDateTime.minusDays(10);
System.out.println(localDateTime3);
System.out.println(localDateTime4);

输出:
2021-07-06T20:21:02.542
2021-06-23T20:21:02.542

Instant

时间线上的一个瞬时点,被用来记录应用程序中的事件时间戳。

now()

//日期变更子午线时间
Instant instant = Instant.now();
System.out.println(instant);
输出:
2021-07-03T12:21:02.543Z

添加偏移量(时区)

// 添加时间的偏移量--东八区时区
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);
输出:
2021-07-03T20:21:02.543+08:00

获取时间戳(从1970年1月1日0时0分0秒开始的毫秒数)

long l = instant.toEpochMilli();
System.out.println(l);
输出:
1625314862543

根据毫秒时间戳返回Instant对象

Instant instant1 = Instant.ofEpochMilli(l);
System.out.println(instant1);

输出:
2021-07-03T12:21:02.543Z

DateTimeFormatter

ofPattern

静态方法,返回一个指定字符串格式的DateTimeFormatter
DateTimeFormatter dateTimeFormatter6 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

format格式化为字符串

DateTimeFormatter dateTimeFormatter6 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String format6 = dateTimeFormatter6.format(LocalDate.now());
System.out.println(format6);
输出:
2021-07-03

时间戳转为字符串
DateTimeFormatter dateTimeFormatter6 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format6 = dateTimeFormatter6.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(1636370296330L),ZoneId.systemDefault()));
System.out.println(format6);
输出:
2021-11-08 19:18:16

parse解析为时间/日期

DateTimeFormatter dateTimeFormatter7 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(LocalDateTime.parse("2021-07-03 05:33:30",dateTimeFormatter7));

输出:
2021-07-03T05:33:30

Period

用于计算日期相对间隔(无法隔月计算)

//用于计算两个日期间隔
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse("2019-03-04", fmt);
LocalDate endDate = LocalDate.parse("2018-02-01", fmt);

Period period = Period.between(startDate, endDate);
System.out.println("相差:" + period.getYears() + " 年 " + period.getMonths() + " 个月 " + period.getDays() + " 天");

输出:
相差:-1 年 -1 个月 -3 天

隔月计算要用toEpochDay方法

//获取当前时间
LocalDate localDate1 = LocalDate.now();
LocalDate localDate2 = localDate1.plusDays(100);
// 无法隔月计算
System.out.println(Period.between(localDate1, localDate2).getDays());
System.out.println(localDate2.toEpochDay()-localDate1.toEpochDay());

输出:
8
100

Duration

用于计算时间间隔

//用于计算时间差
LocalDateTime localDateTime5 = LocalDateTime.now();
LocalDateTime localDateTime6 = localDateTime5.plusDays(1);
Duration between = Duration.between(localDateTime5, localDateTime6);
System.out.println(between.getSeconds());

输出:
86400

计算日期绝对间隔

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse("2019-03-01",fmt);
LocalDate endDate = LocalDate.parse("2020-07-08",fmt);
System.out.println("总相差的天数:" + startDate.until(endDate, ChronoUnit.DAYS));
System.out.println("总相差的月数:" + startDate.until(endDate, ChronoUnit.MONTHS));
System.out.println("总相差的年数:" + startDate.until(endDate, ChronoUnit.YEARS));

输出:
总相差的天数:495
总相差的月数:16
总相差的年数:1

常用日期获取

// 本周一
LocalDate.now().with(DayOfWeek.of(1));
// 下周一
LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.of(1)));

// 本月第一天
LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
或
LocalDate.now().withDayOfMonth(1)

//下月第一天
LocalDate.now().plusMonths(1).with(TemporalAdjusters.firstDayOfMonth())

输出:
2021-07-05
2021-07-12
2022-03-01
2022-03-01
2022-04-01

String、Date、LocaDate、LocalTime、LocalDateTime 相互转换

String 与 Date相互转换

// Date转String
Date date = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf1.format(date));
sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf1.format(date));
sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println(sdf1.format(date));

--输出:
2021-11-21
2021-11-21 20:41:05
2021年11月21日 20:41:05


// String 转 Date
String string = "2016-10-24 21:59:06";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf2.parse(string));

--输出:
Mon Oct 24 21:59:06 CST 2016

String 与 LocaDate相互转换

// LocalDate 转 String
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 这里不能用 yyyy-MM-dd HH:mm:ss 原因是LocalDate本身不含时分秒
LocalDate now = LocalDate.now();
String localTime = df.format(now);
System.out.println(localTime);

--输出
2021-11-21


// String 转 LocalDate
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate ldt = LocalDate.parse("2017-09-28", df);
System.out.println(ldt);

--输出
2017-09-28

或者
LocalDate ldt = LocalDate.parse("2017-09-28");
System.out.println(ldt);

--输出
2017-09-28


如果用yyyy-MM-dd HH:mm:ss但是输出仍然只是年月日
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDate ldt = LocalDate.parse("2017-09-28 11:11:11", df);
System.out.println(ldt);

--输出
2017-09-28

String 与 LocaTime相互转换

// LocalTime 转 String
DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime now = LocalTime.now();
String localTime = df.format(now);
System.out.println(localTime);

--输出
21:37:09


// String 转 LocalTime
DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime ldt = LocalTime.parse("21:11:01", df);
System.out.println(ldt);

--输出
21:11:01

String 与 LocalDateTime相互转换

// LocalTimeDate 转 String
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
String localTime = df.format(now);
System.out.println(localTime);

--输出
2021-11-21 20:56:01

//String 转 LocalTimeDate
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); //这里不能用yyyy-MM-dd
LocalDateTime ldt = LocalDateTime.parse("2017-09-28 23:11:11", df);
System.out.println(ldt);

--输出
2017-09-28T23:11:11

Date 与 LocalDate相互转换

//LocalDate转Date
LocalDate localDate = LocalDate.now();
ZoneId zoneId = ZoneId.systemDefault();
Date date = Date.from(localDate.atStartOfDay().atZone(zoneId).toInstant());
System.out.println(date);

--输出:
Sun Nov 21 00:00:00 CST 2021


//Date转LocalDate
Date date = new Date();
ZoneId zoneId = ZoneId.systemDefault();
LocalDate localDate = date.toInstant().atZone(zoneId).toLocalDate();
System.out.println(localDate);

--输出:
2021-11-21

Date 与 LocalTime 转换

//Date转LocalTime
Date date = new Date();
ZoneId zoneId = ZoneId.systemDefault();
LocalTime localTime = date.toInstant().atZone(zoneId).toLocalTime();
System.out.println(localTime);

--输出:
21:41:31.140

Date 与 LocalDateTime相互转换

// LocalDateTime转Date
在LocalDateTime 转 Date 时,需要使用到 Java 8的几个类

ZoneId/ZoneOffset:表示时区
ZonedDateTime: 表示特定时区的日期和时间
Instant:表示时刻,不直接对应年月日信息,需要通过时区转换

LocalDateTime localDateTime = LocalDateTime.now();
//获取系统默认时区
ZoneId zoneId = ZoneId.systemDefault();
//时区的日期和时间
ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
//获取时刻
Date date = Date.from(zonedDateTime.toInstant());
System.out.println(date);

--输出
Sun Nov 21 21:25:20 CST 2021


// Date转LocalDateTime
Date date = new Date();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = date.toInstant().atZone(zoneId).toLocalDateTime();
System.out.println(localDateTime);

--输出
2021-11-21T21:27:10.717

LocalDate 与 LocalDateTime相互转换

// LocalDateTime转LocalDate
LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate = localDateTime.toLocalDate();
ystem.out.println(localDate);

--输出:
2021-11-21

// LocalDate转LocalDateTime
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime1 = localDate.atStartOfDay();
LocalDateTime localDateTime2 = localDate.atTime(8,20,33);
LocalDateTime localDateTime3 = localDate.atTime(LocalTime.now());
System.out.println(localDateTime1);
System.out.println(localDateTime2);
System.out.println(localDateTime3);

--输出:
2021-11-21T00:00
2021-11-21T08:20:33
2021-11-21T21:31:07.340

LocalTime 与 LocalDateTime转换

// LocalDateTime转LocalTime
LocalDateTime localDateTime = LocalDateTime.now();
LocalTime localTime = localDateTime.toLocalTime();
System.out.println(localTime);

--输出
21:43:05.884

LocalDateTime与Long转换

LocalDateTime 转 Long(毫秒时间戳)

ZoneId zone = ZoneId.systemDefault();
Instant instant = LocalDateTime.now().atZone(zone).toInstant();
System.out.println(instant.toEpochMilli());

--输出:
1640444452715


Long(毫秒时间戳) 转  LocalDateTime
 
Instant instant = Instant.ofEpochMilli(1640444137993L);
ZoneId zone = ZoneId.systemDefault();
System.out.println(LocalDateTime.ofInstant(instant, zone));

--输出:
2021-12-25T22:55:37.993

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值