百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

Java8日期时间类使用详解,干货满满,不容错过哦

xsobi 2024-12-17 17:07 25 浏览

1 获取当前时间

Bash
// 代码
@Test
public void now(){
  LocalDate localDate = LocalDate.now();
  log.info("日期:"+ localDate);
  LocalTime localTime = LocalTime.now();
  log.info("时间:"+ localTime);
  LocalDateTime localDateTime = LocalDateTime.now();
  log.info("日期时间:"+ localDateTime);
}
// 输出
INFO - 日期:2023-09-05
INFO - 时间:22:28:21.994
INFO - 日期时间:2023-09-05T22:28:21.994

2 设置指定时间

Bash
// 代码
@Test
public void setDateTime(){
  // 设置指定的年、月、日、时、分、秒
  LocalDateTime localDateTime = LocalDateTime.of(2023, 10, 1, 10, 30, 30);
  log.info(localDateTime);
  // 获取一天中小时间和最大时间
  LocalDate localDate = LocalDate.now();
  log.info(localDate);
  LocalDateTime min = LocalDateTime.of(localDate, LocalTime.MIN);
  log.info(min);
  LocalDateTime max = LocalDateTime.of(localDate, LocalTime.MAX);
  log.info(max);
}
// 输出
INFO - 2023-10-01T10:30:30
INFO - 2023-09-05
INFO - 2023-09-05T00:00
INFO - 2023-09-05T23:59:59.999999999

3 获取年、月、日、时、分、秒、星期几

// 代码
@Test
public void getDateTimeInfo(){
  LocalDateTime localDateTime = LocalDateTime.now();
  // 获取年
  int year = localDateTime.getYear();
  log.info("年:"+year);
  // 获取月
  Month month = localDateTime.getMonth();
  int monthValue = localDateTime.getMonthValue();
  log.info("月:"+month);
  log.info("月:"+monthValue);
  // 获取日
  int dayOfMonth = localDateTime.getDayOfMonth();
  log.info("日:"+dayOfMonth);
  // 获取时
  int hour = localDateTime.getHour();
  log.info("时:"+hour);
  // 获取分
  int minute = localDateTime.getMinute();
  log.info("分:"+minute);
  // 获取秒
  int second = localDateTime.getSecond();
  log.info("秒:"+second);
  // 获取星期几
  DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
  log.info("星期:"+dayOfWeek);
}
// 输出
INFO - 年:2023
INFO - 月:SEPTEMBER
INFO - 月:9
INFO - 日:5
INFO - 时:22
INFO - 分:37
INFO - 秒:50
INFO - 星期:TUESDAY

4 设置指定的年、月、日

// 代码
@Test
public void setDate(){
  LocalDate localDate = LocalDate.now();
  log.info("当前日期:"+localDate);
  // 设置本月第10天
  LocalDate withDayOfMonth = localDate.withDayOfMonth(10);
  log.info("设置本月第10天:"+withDayOfMonth);
  // 设置本年第100天
  LocalDate withDayOfYear = localDate.withDayOfYear(100);
  log.info("设置本年第100天:"+withDayOfYear);
  // 设置本年10月
  LocalDate withMonth = localDate.withMonth(10);
  log.info("设置本年10月:"+withMonth);
  // 设置3000年
  LocalDate withYear = localDate.withYear(3000);
  log.info("设置3000年:"+withYear);
}
// 输出
INFO - 当前日期:2023-09-05
INFO - 设置本月第10天:2023-09-10
INFO - 设置本年第100天:2023-04-10
INFO - 设置本年10月:2023-10-05
INFO - 设置3000年:3000-09-05

5 设置偏移量

// 代码
@Test
public void setOff(){
  LocalDateTime localDateTime = LocalDateTime.now();
  // 一周前
  LocalDateTime minusDays = localDateTime.minusDays(7);
  log.info("一周前:"+minusDays);
  // 一周后
  LocalDateTime plusDays = localDateTime.plusDays(7);
  log.info("一周后:"+plusDays);
}
// 输出
INFO - 一周前:2023-08-29T22:48:03.462
INFO - 一周后:2023-09-12T22:48:03.462

6 获取子午线时间和东八区时间

// 代码
@Test
public void getInstance(){
  // 日期变更子午线时间
  Instant instant = Instant.now();
  log.info("子午线时间:"+instant);
  // 东八区时间
  OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
  log.info("东八区时间:"+offsetDateTime);
}
// 输出
INFO - 子午线时间:2023-09-05T14:50:51.398Z
INFO - 东八区时间:2023-09-05T22:50:51.398+08:00

7 时间戳

// 代码
@Test
public void toEpochMilli(){
  Instant instant = Instant.now();
  // 获取从1970年1月1日0时0分0秒开始的毫秒数
  long milli = instant.toEpochMilli();
  log.info("从1970年1月1日0时0分0秒开始的毫秒数:"+milli);
  // 根据毫秒时间戳返回Instant对象
  Instant instant1 = Instant.ofEpochMilli(milli);
  log.info(instant1);
}
// 输出
INFO - 从1970年1月1日0时0分0秒开始的毫秒数:1693925655077
INFO - 2023-09-05T14:54:15.077Z

8 格式化为字符串

// 代码
@Test
public void format(){
  // 格式化为yyyy-MM-dd
  DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  String format1 = dtf1.format(LocalDate.now());
  log.info(format1);
  // 格式化为yyyy-MM-dd HH:mm:ss
  DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  String format2 = dtf2.format(LocalDateTime.ofInstant(Instant.ofEpochMilli(1693925655077L),ZoneId.systemDefault()));
  log.info(format2);
}
// 输出
INFO - 2023-09-05
INFO - 2023-09-05 22:54:15

9 解析为日期时间

// 代码
@Test
public void parse(){
  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  log.info(LocalDateTime.parse("2023-10-01 10:30:30",dtf));
}
// 输出
INFO - 2023-10-01T10:30:30

10 周期Period

// 代码
@Test
public void period(){
  // 用于计算日期相对间隔(无法隔月计算)
  DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  LocalDate startDate = LocalDate.parse("2021-03-26", fmt);
  LocalDate endDate = LocalDate.parse("2023-10-01", fmt);
  Period period = Period.between(startDate, endDate);
  log.info("相差:" + period.getYears() + " 年 " + period.getMonths() + " 个月 " + period.getDays() + " 天");
  // 隔月计算要用toEpochDay方法
  LocalDate localDate = LocalDate.now();
  LocalDate localDate1 = localDate.plusDays(100);
  // 无法隔月计算
  log.info(Period.between(localDate, localDate1).getDays());
  // 可以计算隔月
  log.info(localDate1.toEpochDay()-localDate.toEpochDay());
}
// 输出
INFO - 相差:2 年 6 个月 5 天
INFO - 9
INFO - 100

11 时间间隔Duration

// 代码
@Test
public void duration(){
  // 用于计算时间差
  LocalDateTime localDateTime = LocalDateTime.now();
  LocalDateTime localDateTime2 = localDateTime.plusDays(1);
  Duration between = Duration.between(localDateTime, localDateTime2);
  log.info(between.getSeconds());
  // 计算日期绝对间隔
  DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  LocalDate startDate = LocalDate.parse("2020-03-26",fmt);
  LocalDate endDate = LocalDate.parse("2023-10-01",fmt);
  log.info("总相差的天数:" + startDate.until(endDate, ChronoUnit.DAYS));
  log.info("总相差的月数:" + startDate.until(endDate, ChronoUnit.MONTHS));
  log.info("总相差的年数:" + startDate.until(endDate, ChronoUnit.YEARS));
}
// 输出
INFO - 86400
INFO - 总相差的天数:1284
INFO - 总相差的月数:42
INFO - 总相差的年数:3

12 常用日期获取

// 代码
@Test
public void with(){
  // 本周一
  LocalDate with = LocalDate.now().with(DayOfWeek.of(1));
  log.info("本周一:"+with);
  // 下周一
  LocalDate with1 = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.of(1)));
  log.info("下周一:"+with1);
  // 本月第一天
  LocalDate with2 = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
  log.info("本月第一天:"+with2);
  // 下月第一天
  LocalDate with3 = LocalDate.now().plusMonths(1).with(TemporalAdjusters.firstDayOfMonth());
  log.info("下月第一天:"+with3);
}
// 输出
INFO - 本周一:2023-09-04
INFO - 下周一:2023-09-11
INFO - 本月第一天:2023-09-01
INFO - 下月第一天:2023-10-01

13 String与Date相互转换

// 代码
@Test
public void string2Date() throws Exception{
  // Date转String
  Date date = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  log.info(sdf.format(date));
  sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  log.info(sdf.format(date));
  sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
  log.info(sdf.format(date));
  // String 转 Date
  String string = "2016-10-24 21:59:06";
  SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  log.info(sdf2.parse(string));
}
// 输出
INFO - 2023-09-05
INFO - 2023-09-05 23:14:34
INFO - 2023年09月05日 23:14:34
INFO - Mon Oct 24 21:59:06 CST 2016

14 String与LocaDate相互转换

// 代码
@Test
public void string2LocalDate(){
  // LocalDate 转 String
  // 这里不能用 yyyy-MM-dd HH:mm:ss 原因是LocalDate本身不含时分秒
  DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  LocalDate now = LocalDate.now();
  String localTime = df.format(now);
  log.info(localTime);

  // String 转 LocalDate
  LocalDate ldt = LocalDate.parse("2023-10-01", df);
  log.info(ldt);

  LocalDate ldt2 = LocalDate.parse("2023-10-01");
  log.info(ldt2);

  // 如果用yyyy-MM-dd HH:mm:ss 但是输出仍然只是年月日
  DateTimeFormatter df2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  LocalDate ldt3 = LocalDate.parse("2023-10-01 11:11:11", df2);
  log.info(ldt3);
}
// 输出
INFO - 2023-09-05
INFO - 2023-10-01
INFO - 2023-10-01
INFO - 2023-10-01

15 String与LocaTime相互转换

// 代码
@Test
public void string2LocalTime(){
  // LocalTime 转 String
  DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm:ss");
  LocalTime now = LocalTime.now();
  String localTime = df.format(now);
  log.info(localTime);
  // String 转 LocalTime
  LocalTime ldt = LocalTime.parse("23:30:01", df);
  log.info(ldt);
}
// 输出
INFO - 23:22:17
INFO - 23:30:01

16 String与LocalDateTime相互转换

// 代码
@Test
public void string2LocalDateTime(){
  // LocalTimeDate 转 String ,这里不能用yyyy-MM-dd
  DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  LocalDateTime now = LocalDateTime.now();
  String localTime = df.format(now);
  log.info(localTime);
  //String 转 LocalTimeDate
  LocalDateTime ldt = LocalDateTime.parse("2023-10-01 23:30:30", df);
  log.info(ldt);
}
// 输出
INFO - 2023-09-05 23:25:01
INFO - 2023-10-01T23:30:30

17 Date与LocalDate相互转换

// 代码
@Test
public void date2LocalDate(){
  // LocalDate转Date
  LocalDate localDate = LocalDate.now();
  ZoneId zoneId = ZoneId.systemDefault();
  Date date = Date.from(localDate.atStartOfDay().atZone(zoneId).toInstant());
  log.info(date);
  // Date转LocalDate
  Date date2 = new Date();
  LocalDate localDate2 = date2.toInstant().atZone(zoneId).toLocalDate();
  log.info(localDate2);
}
// 输出
INFO - Tue Sep 05 00:00:00 CST 2023
INFO - 2023-09-05

18 Date与LocalTime转换

// 代码
@Test
public void date2LocalTime(){
  //Date转LocalTime
  Date date = new Date();
  ZoneId zoneId = ZoneId.systemDefault();
  LocalTime localTime = date.toInstant().atZone(zoneId).toLocalTime();
  log.info(localTime);
}
// 输出
INFO - 23:29:27.233

19 Date与LocalDateTime相互转换

// 代码
@Test
public void date2LocalDateTime(){
  // 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());
  log.info(date);

  // Date转LocalDateTime
  Date date2 = new Date();
  LocalDateTime localDateTime2 = date2.toInstant().atZone(zoneId).toLocalDateTime();
  log.info(localDateTime2);
}
// 输出
INFO - Tue Sep 05 23:31:52 CST 2023
INFO - 2023-09-05T23:31:52.903

20 LocalDate与LocalDateTime相互转换

// 代码
@Test
public void localDate2LocalDateTime(){
  // LocalDateTime转LocalDate
  LocalDateTime localDateTime = LocalDateTime.now();
  LocalDate localDate = localDateTime.toLocalDate();
  log.info(localDate);
  // LocalDate转LocalDateTime
  LocalDate localDate2 = LocalDate.now();
  LocalDateTime localDateTime1 = localDate2.atStartOfDay();
  LocalDateTime localDateTime2 = localDate2.atTime(10,10,10);
  LocalDateTime localDateTime3 = localDate2.atTime(LocalTime.now());
  log.info(localDateTime1);
  log.info(localDateTime2);
  log.info(localDateTime3);
}
// 输出
INFO - 2023-09-05
INFO - 2023-09-05T00:00
INFO - 2023-09-05T10:10:10
INFO - 2023-09-05T23:34:23.806

21 LocalTime与LocalDateTime转换

// 代码
@Test
public void localTime2LocalDateTime(){
  // LocalDateTime转LocalTime
  LocalDateTime localDateTime = LocalDateTime.now();
  LocalTime localTime = localDateTime.toLocalTime();
  log.info(localTime);
}
// 输出
INFO - 23:36:05.098

22 LocalDateTime与Long转换

// 代码
@Test
public void localDateTime2Long(){
  // LocalDateTime 转 Long(毫秒时间戳)
  ZoneId zone = ZoneId.systemDefault();
  Instant instant = LocalDateTime.now().atZone(zone).toInstant();
  log.info(instant.toEpochMilli());
  // Long(毫秒时间戳) 转  LocalDateTime
  Instant instant1 = Instant.ofEpochMilli(1693928280738L);
  log.info(LocalDateTime.ofInstant(instant1, zone));
}
// 输出
INFO - 1693928304283
INFO - 2023-09-05T23:38:00.738

23 总结

Java8吸收了Joda-Time的精华,以一个新的开始为Java创建优秀的API。新的java.time中包含了所有关于本地时间(LocalDate)、本地时间(LocalTIme)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。本文主要介绍了常用的一些基本方法,大家可以在本地验证下,也可以封装成工具类在生产上使用,很是方便。

【温馨提示】

点赞+收藏文章,关注我并私信回复【面试题解析】,即可100%免费领取楼主的所有面试题资料!

相关推荐

建站 | 从零开始打造自己的网站--以创意众筹网项目为例

文/跨界哥经过前几期的思考探索,跨界哥的创意众筹网项目的大概框架已经有了雏形,今天真正开始着手网站的建设。从零开始打造属于自己的网站,自己终于做了站长,想想还是有点小激动。简单描述下创意众筹网的核心业...

MyEclipse应用服务器教程:应用程序服务器入门指南(上)

1.定义一个新的服务器定义一个新的服务器允许您选择需要使用的服务器连接,并提供配置信息,然后选择项目部署到服务器上。(1)在服务器视图工具栏上点击new_server_icon。或者右键单击服务器视...

ABP异常为什么是403呢?

前言在ABP中使用UserFriendlyException抛出异常,HTTP状态码为什么是403?下面用这一段测试代码:[HttpPost]publicasyncTask<PeopleD...

Web自动化测试:模拟鼠标操作(ActionChains)

在日常的测试中,经常会遇到需要鼠标去操作的一些事情,比如说悬浮菜单、拖动验证码等,这一节我们来学习如何使用webdriver模拟鼠标的操作首页模拟鼠标的操作要首先引入ActionChains的包fro...

webapi 全流程

C#中的WebAPIMinimalApi没有控制器,普通api有控制器,MinimalApi是直达型,精简了很多中间代码,广泛适用于微服务架构MinimalApi一切都在组控制台应用程序类【Progr...

SpringBoot日志处理之Logback

日志处理是一个正式项目必备的功能,日志要能够根据时间、类型等要素,根据指定格式来保存指定的日志,方便我们观察程序运行情况、定位程序bug。SpringBoot中推荐使用Logback日志框架。slf4...

ASP.NET Core Web API 接口限流

一.前言ASP.NETCoreWebAPI接口限流、限制接口并发数量,我也不知道自己写的有没有问题,抛砖引玉、欢迎来喷!二.需求写了一个接口,参数可以传多个人员,也可以传单个人员,时间范围...

高德打车通用可编排订单状态机引擎设计

一背景订单状态流转是交易系统的最为核心的工作,订单系统往往都会存在状态多、链路长、逻辑复杂的特点,还存在多场景、多类型、多业务维度等业务特性。在保证订单状态流转稳定性的前提下、可扩展性和可维护性是我...

.Net6基础功能封装分享12(统一参数校验)

开发后台webapi接口,需要对接口传入的参数进行校验,如果传入的参数不符合验证规则,就直接返回参数错误,就需要封装统一参数校验过滤器;在.net6中,内置了DataAnnotations实现通过数据...

Path to prosperity for US and the world lies in cooperation, not confrontation

ThisisaneditorialfromChinaDaily.Turningadeafeartothe"handsoff"criesofprotestersnot...

C++ strategy策略模式

策略模式策略模式是一种行为设计模式,它定义了一组算法,他们可以以相同的接口共享。这种模式使用场景最多的就是在根据不同的条件选择不同的行为时,可以使用此模式进行解耦,使得你的代码更加易于维护和扩展,当然...

万字图文详解24种设计模式

一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错,花了不少心思来写这文章和做图,力求让读者真的能看着简单同时有所收获。设计模...

25000 字详解 23 种设计模式(多图 + 代码)

文章来源:https://javadoop.com/post/design-pattern目录创建型模式结构型模式行为型模式总结前言一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看...

C# 设计模式之-状态模式

问题引入仓库管理系统中,堆垛机任务的状态的变更,一般会引起一系列相关的的变更,如入库完成,就需要修改库位状态为:工作中;出库完成,则需要将任务对应的库位状态修改为:空闲;此时可以使用状态模式来将堆垛机...

seata-golang 接入指南

作者|刘晓敏来源|阿里巴巴云原生公众号seata-golang是一个分布式事务框架,实现了AT模式和TCC模式,AT模式相较TCC模式对代码的入侵性更小、需要开发的接口更少;但A...