【高级编程】实用类详解(下)万字整理Java时间日期类 JDK8新日期

2024-09-05 19:44

本文主要是介绍【高级编程】实用类详解(下)万字整理Java时间日期类 JDK8新日期,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 日期时间
      • Date
      • SimpleDateFormat
      • Calendar
    • JDK8 新日期
      • LocalDateTime&LocalDate&LocalTime
      • DateTimeFormater
      • 计算
      • Period&Duration
      • zonedDateTime
      • Instant
      • 类型转换
    • 注意事项


日期时间

Date

java.util.Date 类:表示日期和时间。提供操作日期和时间各组成部分的方法。

Date 对象记录的时间是用毫秒值来表示的。Java 语言规定,1970年1月1日0时0分0秒认为是时间的起点,此时记作0,1 秒 =1000 毫秒,1000就表示1970年1月1日0时0分1秒。

// 创建日期对象
Date date = new Date(); 
常见方法说明
public long getTime()返回从1970年1月1日00:00:00走到此刻的总的毫秒数
public void setTime(long time)设置日期对象的时间为当前时间毫秒值对应的时间

SimpleDateFormat

java.text.SimpleDateFormat 类:转换 Date 对象表示日期时间的显示格式。用于定制日期时间的格式。

  • Date 对象转换为指定格式的日期字符串:日期格式化
  • 指定格式的日期符串转换为 Date 对象:日期解析
格式化时间的方法说明
public final string format(Date date)将日期格式化成日期/时间字符串
public final string format(0bject time)将时间毫秒值式化成日期/时间字符串
解析方法说明
public Date parse(String source)把字符串时间解析成日期对象
字母	  表示含义
yyyy	年
MM		月
dd		日
HH		时
mm		分
ss		秒
SSS		毫秒
"2022年12月12日" 的格式是 "yyyy年MM月dd日"
"2022-12-12 12:12:12" 的格式是 "yyyy-MM-dd HH:mm:ss"
// 按照上面的格式可以任意拼接,但是字母不能写错
// 获得当前时间
Date date = new Date();
System.out.println(date);// 创建格式化日期工具 并指定格式 yyyy-MM-dd HH:mm:ss.SSS
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 调用format方法,格式化日期,并返回字符串
String strdate = sdf.format(date);
System.out.println("格式化后:" + strdate);// 将字符串转换为日期类型
try {Date br = sdf.parse("1991-12-31 01:01:01");System.out.println(br);
} catch (ParseException e) {throw new RuntimeException(e);
}
Thu Sep 05 10:45:09 CST 2024
格式化后:2024-09-05 10:45:09
Tue Dec 31 01:01:01 CST 1991

Calendar

java.util.Calendar 抽象类,用于设置和获取日期/时间数据的特定部分。可以直接对日历中的年、月、日、时、分、秒等进行运算。

方法或属性说明
public static Calendar getInstance()获取当前日历对象
public int get(int field)获取日历中的某个信息。
public final Date getTime()获取日期对象。
public long getTimeInMillis()获取时间毫秒值
public void set(int field,int value)修改日历的某个信息。
public void add(int field,int amount)为某个信息增加/减少指定的值
MONTH指示月
DAY_OF_MONTH指示一个月中的某天
DAY_OF_WEEK指示一个星期中的某天

calendar是可变对象,一旦修改后其对象本身表示的时间将产生变化。

// 在Calendar类中,月份是从 0 开始计数的。以下是每个月份对应的常量及其对应的数字:
Calendar.JANUARY: 0
Calendar.FEBRUARY: 1
Calendar.MARCH: 2
Calendar.APRIL: 3
Calendar.MAY: 4
Calendar.JUNE: 5
Calendar.JULY: 6
Calendar.AUGUST: 7
Calendar.SEPTEMBER: 8
Calendar.OCTOBER: 9
Calendar.NOVEMBER: 10
Calendar.DECEMBER: 11
Calendar cal = Calendar.getInstance();System.out.println(cal.get(Calendar.YEAR)); // 年
System.out.println(cal.get(Calendar.MONTH) + 1); // 月 (0-11, 所以加1)
System.out.println(cal.get(Calendar.DATE)); // 日
System.out.println(cal.get(Calendar.HOUR_OF_DAY)); // 时 (24小时制)
System.out.println(cal.get(Calendar.MINUTE)); // 分
System.out.println(cal.get(Calendar.SECOND)); // 秒
System.out.println(cal.get(Calendar.MILLISECOND)); // 毫秒

JDK8 新日期

JDK 8 引入了全新的日期和时间 API,主要集中在 java.time 包中。它解决了旧版 java.util.Datejava.util.Calendar 的一些问题,并提供了更强大和易用的功能。主要类包括:

  • LocalDateTime:表示日期和时间,但不包含时区信息。
  • LocalDate:仅表示日期,不包含时间和时区信息。
  • LocalTime:仅表示时间,不包含日期和时区信息。
  • ZonedDateTime:表示日期、时间和时区,适用于跨时区操作。
  • Period:表示日期间隔,通常用于计算两个日期之间的差异。
  • Duration:表示时间间隔,用于计算两个时间点之间的时长。
  • Instant:表示时间戳,基于 UTC 时间。适用于需要精确的时间点。

LocalDateTime&LocalDate&LocalTime

当前日期时间

// 获取当前日期
LocalDate currentDate = LocalDate.now();
System.out.println("当前日期: " + currentDate);// 获取当前时间
LocalTime currentTime = LocalTime.now();
System.out.println("当前时间: " + currentTime);// 获取当前日期和时间
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("当前日期和时间: " + currentDateTime);
当前日期: 2024-09-05
当前时间: 11:54:48.556
当前日期和时间: 2024-09-05T11:54:48.556
  • LocalDate类的基本使用
方法名说明
public int getYear()获取年
public int getMonthValue()获取月份(1-12)
public int getDayOfMonth()获取日
public int getDayOfYear()获取当前是一年中的第几天
public DayOfWeek getDayOfWeek()获取星期几: ld.getDayOfWeek().getValue()
方法名说明
withYear、withMonth、withDayOfMonth、withDayOfYear直接修改某个信息,返回新日期对象
plusYears、plusMonths、plusDays、plusWeeks把某个信息加多少,返回新日期对象
minusMonths、minusDays、minusWeeks把某个信息减多少,返回新日期对象
equals isBefore isAfter判断两个日期对象,是否相等,在前还是在后
  • LocalTime类的基本使用
方法名说明
public int getHour()获取小时
public int getMinute()获取分
public int getSecond()获取秒
public int getNano()获取纳秒
方法名说明
withHour、withMinute、withSecond、withNano时间,返回新时间对象
plusHours、plusMinutes、plusSeconds、plusNanos把某个信息加多少,返回新时间对象
minusHours、minusMinutes、minusSeconds、minusNanos把某个信息减多少,返回新时间对象
equals isBefore isAfter判断两个日期对象,是否相等,在前还是在后
  • LocalDateTime类的基本使用

LocalDateTime的转换成LocalDate、LocalTime

方法名说明
public LocalDate toLocalDate()转换成一个LocalDate 对象
public LocalTime toLocalTime()转换成一个LocalTime 对象

DateTimeFormater

格式化

DateTimeFormater 格式化器。新增的日期格式化类,可以从来对日期进行格式化和解析。代替了原来的 SimpleDateFormat 类。

方法名说明
public static DateTimeFormater ofPattern(时间格式)获取格式化器对象
public String format(时间对象)格式化时间

LocalDateTime 提供的格式化、解析时间的方法

方法名说明
public String format(DateTimeFormatter formatter)格式化时间
public static LocalDateTime parse(CharSequence. text,DateTimeFormatter formatter)解析时间
// 创建一个DateTimeFormatter对象,指定日期时间的格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 格式化当前日期时间
String formattedDateTime = currentDateTime.format(formatter);
System.out.println("格式化后的日期和时间: " + formattedDateTime);// 使用预定义的格式
String isoDateTime = currentDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println("ISO格式的日期和时间: " + isoDateTime);
格式化后的日期和时间: 2024-09-05 11:54:48
ISO格式的日期和时间: 2024-09-05T11:54:48.556

计算

// 日期加减
LocalDate futureDate = currentDate.plusDays(5);
LocalDate pastDate = currentDate.minusMonths(1);
System.out.println("未来5天后的日期: " + futureDate);
System.out.println("1个月前的日期: " + pastDate);// 时间加减
LocalTime timePlusHours = currentTime.plusHours(2);
LocalTime timeMinusMinutes = currentTime.minusMinutes(30);
System.out.println("2小时后的时间: " + timePlusHours);
System.out.println("30分钟前的时间: " + timeMinusMinutes);
未来5天后的日期: 2024-09-10
1个月前的日期: 2024-08-05
2小时后的时间: 13:54:48.556
30分钟前的时间: 11:24:48.556

Period&Duration

计算时间间隔

Period 类和 Duration 类都可以用来对计算两个时间点的时间间隔。

  • Period:计算日期间隔(年、月、日)
  • Duration:计算时间间隔(时、分、秒、纳秒)

Period 可以用来计算两个日期之间相隔的年、相隔的月、相隔的日。

只能两个计算 LocalDate 对象之间的间隔

Period period = Period.between(LocalDate.of(2023, 1, 1), LocalDate.of(2023, 12, 31));
System.out.println("年份差异: " + period.getYears());
System.out.println("月份差异: " + period.getMonths());
System.out.println("天数差异: " + period.getDays());
年份差异: 0
月份差异: 11
天数差异: 30

Duration 用来表示两个时间对象的时间间隔。

可以用于计算两个时间对象相差的天数、小时数、分数、秒数、纳秒数;支持 LocalTimeLocalDateTimeInstant等时间

LocalDateTime start = LocalDateTime.of(2025, 11, 10, 11, 11, 11);
LocalDateTime end = LocalDateTime.of(2025, 11, 11, 11, 11, 11);
// 1、得到Duration对象
Duration duration = Duration.between(start, end);
// 2、获取两个时间对象间隔的信息
System.out.println("间隔天: " + duration.toDays());
System.out.println("间隔小时: " + duration.toHours());
System.out.println("间隔分: " + duration.toMinutes());
System.out.println("间隔秒: " + duration.getSeconds());
System.out.println("间隔毫秒: " + duration.toMillis());
System.out.println("间隔纳秒: " + duration.toNanos());
间隔天: 1
间隔小时: 24
间隔分: 1440
间隔秒: 86400
间隔毫秒: 86400000
间隔纳秒: 86400000000000

zonedDateTime

时区时间

由于世界各个国家与地区的经度不同,各地区的时间也有所不同,因此会划分为不同的时区。每一个时区的时间也不太一样。

方法名说明
public static Set<String> getAvailableZoneIds()获取 Java 支持的全部时区 Id
public static ZoneId systemDefault()获取系统默认的时区
public static ZoneId of(String zoneId)把某个时区 id 封装成 ZoneId 对象
// 获取带时区的日期时间
ZonedDateTime zonedDateTime = currentDateTime.atZone(ZoneId.systemDefault());
System.out.println("带时区的日期和时间: " + zonedDateTime);// 转换时区
ZonedDateTime zonedDateTimeUTC = zonedDateTime.withZoneSameInstant(ZoneId.of("UTC"));
System.out.println("UTC时区的日期和时间: " + zonedDateTimeUTC);
带时区的日期和时间: 2024-09-05T11:54:48.556+08:00[Asia/Shanghai]
UTC时区的日期和时间: 2024-09-05T03:54:48.556Z[UTC]

Instant

Instant 是 Java 8 引入的 java.time 包中的一个类,用于表示时间线上的一个特定时刻。Instant 是一个精确到纳秒的时间表示,适用于需要高精度时间计算的场景。它简化了处理时间戳的复杂性,并提供了方便的 API 用于时间计算和比较。

  • 时间戳: Instant 表示自 1970-01-01T00:00:00Z(即 Unix 纪元时间)以来的时间点,以秒和纳秒的精度。
  • 不包含时区: Instant 只是一个时间点,不包含任何时区或日期信息。它只是一个绝对时间戳。
// 获取当前时间点
Instant now = Instant.now();
System.out.println("当前时间点: " + now);// 创建一个特定时间点
Instant specificTime = Instant.parse("2024-09-05T01:15:30Z");
System.out.println("特定时间点: " + specificTime);// 比较时间点
boolean isBefore = now.isBefore(specificTime);
System.out.println("现在是在特定时间点之前吗? " + isBefore);// 时间计算
Instant futureTime = now.plusSeconds(3600); // 增加一个小时
System.out.println("一小时以后: " + futureTime);
当前时间点: 2024-09-05T09:36:24.111Z
特定时间点: 2024-09-05T01:15:30Z
现在是在特定时间点之前吗? false
一小时以后: 2024-09-05T10:36:24.111Z

类型转换

// 转换为Date类型(如果需要与旧代码兼容)
Date oldStyleDate = Date.from(currentDateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("转换为Date类型: " + oldStyleDate);// 转换为字符串与Date的相互转换(例如,从数据库读取或写入)
String dateString = oldStyleDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
System.out.println("日期时间字符串: " + dateString);
转换为Date类型: Thu Sep 05 11:54:48 CST 2024
日期时间字符串: 2024-09-05T11:54:48.556

注意事项

在进行日期和时间操作时,注意时区的处理,特别是涉及跨时区操作时。使用 DateTimeFormatter 进行日期和时间的解析与格式化时,要确保使用的模式字符串与待处理的日期时间字符串相匹配。尽量避免使用旧版的日期和时间 API(如 java.util.Datejava.util.Calendar),新 API 更加易用且功能强大

这篇关于【高级编程】实用类详解(下)万字整理Java时间日期类 JDK8新日期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139892

相关文章

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B