优秀的编程知识分享平台

网站首页 > 技术文章 正文

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

nanyue 2024-10-22 13:09:42 技术文章 1 ℃

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

最近发表
标签列表