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

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

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

1 获取当前时间

// 代码
@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 设置指定时间

// 代码
@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%免费领取楼主的所有面试题资料!

相关推荐

js向对象中添加元素(对象,数组) js对象里面添加元素

一、添加一个元素对象名["属性名"]=值(值:可以是一个值,可以是一个对象,也可以是一个数组)这样添加进去的元素,就是一个值或对象或数组...

JS小技巧,如何去重对象数组?(一)

大家好,关于数组对象去重的业务场景,想必大家都遇到过类似的需求吧,这对这样的需求你是怎么做的呢。下面我就先和大家分享下如果是基于对象的1个属性是怎么去重实现的。方法一:使用.filter()和....

「C/C++」之数组、vector对象和array对象的比较

数组学习过C语言的,对数组应该都不会陌生,于是这里就不再对数组进行展开介绍。模板类vector模板类vector类似于string,也是一种动态数组。能够在运行阶段设置vector对象的长度,可以在末...

如何用sessionStorage保存对象和数组

背景:在工作中,我将[{},{}]对象数组形式,存储到sessionStorage,然后ta变成了我看不懂的形式,然后我想取之用之,发现不可能了~记录这次深刻的教训。$clickCouponIndex...

JavaScript Array 对象 javascript的array对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

JavaScript中的数组Array(对象) js array数组

1:数组Array:-数组也是一个对象-数组也是用来存储数据的-和object不同,数组中可以存储一组有序的数据,-数组中存储的数据我们称其为元素(element)-数组中的每一个元素都有一...

数组和对象方法&数组去重 数组去重的5种方法前端

列举一下JavaScript数组和对象有哪些原生方法?数组:arr.concat(arr1,arr2,arrn);--合并两个或多个数组。此方法不会修改原有数组,而是返回一个新数组...

C++ 类如何定义对象数组?初始化数组?linux C++第43讲

对象数组学过C语言的读者对数组的概念应该很熟悉了。数组的元素可以是int类型的变量,例如int...

ElasticSearch第六篇:复合数据类型-数组,对象

在ElasticSearch中,使用JSON结构来存储数据,一个Key/Value对是JSON的一个字段,而Value可以是基础数据类型,也可以是数组,文档(也叫对象),或文档数组,因此,每个JSON...

第58条:区分数组对象和类数组对象

示例设想有两个不同类的API。第一个是位向量:有序的位集合varbits=newBitVector;bits.enable(4);bits.enable([1,3,8,17]);b...

八皇后问题解法(Common Lisp实现)

如何才能在一张国际象棋的棋盘上摆上八个皇后而不致使她们互相威胁呢?这个著名的问题可以方便地通过一种树搜索方法来解决。首先,我们需要写一个函数来判断棋盘上的两个皇后是否互相威协。在国际象棋中,皇后可以沿...

visual lisp修改颜色的模板函数 怎么更改visual studio的配色

(defunBF-yansemokuai(tuyuanyanse/ss)...

用中望CAD加载LISP程序技巧 中望cad2015怎么加载燕秀

1、首先请加载lisp程序,加载方法如下:在菜单栏选择工具——加载应用程序——添加,选择lisp程序然后加载,然后选择添加到启动组。2、然后是添加自定义栏以及图标,方法如下(以...

图的深度优先搜索和广度优先搜索(Common Lisp实现)

为了便于描述,本文中的图指的是下图所示的无向图。搜索指:搜索从S到F的一条路径。若存在,则以表的形式返回路径;若不存在,则返回nil。...

两个有助于理解Common Lisp宏的例子

在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。Lisp的宏,是实现上述特色的...