时间日期API(Date,SimpleDateFormat,Calendar)+java8新增日期API (LocalTime,LocalDate,LocalDateTime)

简介: 这篇文章介绍了Java中处理日期和时间的API,包括旧的日期API(Date、SimpleDateFormat、Calendar)和Java 8引入的新日期API(LocalTime、LocalDate、LocalDateTime)。文章详细解释了这些类/接口的方法和用途,并通过代码示例展示了如何使用它们。此外,还讨论了新旧API的区别,新API的不可变性和线程安全性,以及它们提供的操作日期时间的灵活性和简洁性。

时间日期API+java8新增日期API (LocalTime,LocalDate,LocalDateTime)

① Date

java.util 包提供了 Date 类来封装当前的日期和时间。

Date date = new Date();
// 1.toString输出时间 按照一定格式
System.out.println(date); // Mon Jan 29 15:41:38 CST 2024
// 2.获取自1970.1.1起到现在的时间毫秒数
System.out.println(date.getTime()); // date.getTime()获取自1970xxx起的微秒数
// 3.设置时间  参数为自1970.1.1起的毫秒数
date.setTime(514074250); // 将毫秒数加到1970.1.1,然后设置为时间
System.out.println(date); // Wed Jan 07 06:47:54 CST 1970
// 4. 比较日期是否在参数日期之前
System.out.println(date.before(new Date(510000000))); //false
System.out.println(date.before(new Date(530000000))); //true
// 5. 比较日期是否在参数日期之后
System.out.println(date.after(new Date(510000000))); // true
System.out.println(date.after(new Date(530000000))); // false
// 6.比较两个时间  -1 表示在参数时间之前 ;0 表示 两个时间相等 ;1 表示在参数时间之后
System.out.println(date.compareTo(new Date(530000000))); // -1
  1. 创建Date对象,有多个构造器,包括无参数的 new Date(),有参数的 new Date(long Date) 以指定的毫秒数去设置时间,还有一个 new Date(int year, int month, int date) 已经弃用了。
  2. toString()方法格式化时间毫秒数
  3. getTime() 获取自1970.1.1起的毫秒数
  4. setTime() 设置时间,参数为自1970.1.1起的毫秒数
  5. before() 比较日期是否在某个日期之前
  6. after() 比较日期是否在某个日期之后
  7. compareTo() 比较两个时间的大小,然后参数返回是 -1 ,0, 1 就是 Comparable接口那个比较器。
  8. … hashCode()、toInstant()、clone()返回当前对象的副本。

② SimpleDateFormat

SimpleDateFormat格式化分析日期的类

Date date = new Date();
// 格式化日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(sdf.format(date)); // 2024-01-29 02:16:37

③ Calendar

Calender类,对于设置获取日期数据的特定部分,更为简便(例如:获取,小时,分钟,秒,日月),并且可以对日期上进行增加和减去一些时间。

// 1.获取Calendar对象 ,使用getInstance()
Calendar calendar = Calendar.getInstance();
// 2.设置指定的时间
calendar.set(Calendar.YEAR,2027);
calendar.set(Calendar.MONDAY,11);
calendar.set(Calendar.DATE,18);
// calendar.set(2027,11,18);  上面三段代码可以合成一句
// 3.获取时间部分值 ---- 例如:获取年
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));
System.out.println(calendar.get(Calendar.DATE));
// 4.在现有时间上,增加时间-----例如年份
calendar.add(Calendar.YEAR,3); // 年份加3年 2027 + 3 => 2030
System.out.println(calendar.get(Calendar.YEAR)); // 2030
// 5.在现有时间上,减去时间-----例如月份
calendar.add(Calendar.MONTH,-2); // 月份减2月 11-2 => 09
System.out.println(calendar.get(Calendar.MONTH)); // 9

首先,通过Calendar.getInstance()来获取一个Calendar对象
其中,Calendar.set()有多个重载,可以根据不同需求去指定。
image.png
接着,可以通过Calendar.get(field) 来获取指定的时间部分的值
通过 Calendar.add(field,amount) 来增加时间或者减去时间

Calendar类中的常量:

常量 描述
Calendar.YEAR 年份
Calendar.MONTH 月份
Calendar.DATE 日期
Calendar.DAY_OF_MONTH 日期,和上面的字段意义完全相同
Calendar.HOUR 12小时制的小时
Calendar.HOUR_OF_DAY 24小时制的小时
Calendar.MINUTE 分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK 星期几

④ GregorianCalendar

GregorianCalendar类是Calendar类的子类,实现了公历日期。
image.png

//---------------------------------------- GregorianCalendar
GregorianCalendar gregorianCalendar = new GregorianCalendar();
System.out.println(gregorianCalendar.get(Calendar.YEAR));
//  判断是否是闰年  其余方法基本和 Calendar ,需要的话看下api文档就行
System.out.println(gregorianCalendar.isLeapYear(2024));
System.out.println(gregorianCalendar.isLeapYear(2025));

值得注意的方法 gregorianCalendar.isLeapYear(year),判断是否为闰年

⑤ 新的日期API (LocalTime,LocalDate,LocalDateTime)

经过上面旧的日期API使用,很容易感觉到旧的日期API用起来非常麻烦(一大堆毫秒数,时间戳),并且也不是线程安全的,存在一些潜在的并发问题。

Java8 提出了新的日期API,在java.time下。

1. LocalTime 不可变时间对象

LocalTime是Java8中用于才处理时间的不可变类,它只包含时分秒以及纳秒,没有日期部分。它没有时区信息,所以它代表的是一天中的某个时间

以下是LocalTime常用的一些操作及方法。

  1. 创建LocalTime实例

创建 LocalTime 实例的最直接方式是使用它的静态工厂方法,LocalTime.now()

LocalTime now = LocalTime.now();
System.out.println(now); // 16:38:59.015059500
  1. 使用of() 创建一个具体的时间

image.png

LocalTime time = LocalTime.of(22, 33, 44, 55);// 创建 22:33:44.55的时间
System.out.println(time);
  1. 获取时间信息

获取时间信息的方法,见名知意,非常简单。

LocalTime now = LocalTime.now();
// 获取时分秒及纳秒
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int nano = now.getNano();
System.out.println(hour);
System.out.println(minute);
System.out.println(second);
System.out.println(nano);
  1. 修改时间 plus minus

LocalTime是不可变的,所以每个修改时间的操作返回的都是一个新的LocalTime对象,修改时间的方法允许进行链式编程操作。

LocalTime now = LocalTime.now();
// 增加三个小时,4分钟,5秒,10纳秒
LocalTime later = now.plusHours(3).plusMinutes(4).plusSeconds(5).plusNanos(10);
System.out.println(later); //20:25:55.672090010

// 减少1个小时,2分钟,3秒
LocalTime oldTime = now.minusHours(1).minusMinutes(2).minusSeconds(3);
System.out.println(oldTime); //16:19:47.672090
  1. 比较时间 使用 isBefore() isAfter() 或者 compareTo() 【返回值为整型】
LocalTime time1 = LocalTime.of(9,30);
LocalTime time2 = LocalTime.of(10,15);
System.out.println(time1.isBefore(time2)); // true
System.out.println(time1.isAfter(time2)); // false
System.out.println(time1.compareTo(time2)); // -1

2. LocalDate 不可变日期对象

LocalDate 是 Java 8 中用于处理日期的不可变类,它只包含日期部分(年、月、日),没有时间和时区

  1. 创建LocalDate对象
LocalDate today = LocalDate.now();
System.out.println(today); // 2024-01-29
  1. 创建指定日期的LocalDate对象
LocalDate date = LocalDate.of(2027,8,21);
System.out.println(date); // 2027-08-21
  1. 获取日期信息
LocalDate now = LocalDate.now();
int year = now.getYear();
Month month = now.getMonth();
int dayOfMonth = now.getDayOfMonth();

System.out.println(year); // 2024
System.out.println(month); // JANUARY
System.out.println(dayOfMonth); // 29

image.png

  1. 修改日期 plus minus

同样LocalDate也是不可变的,每次修改日期操作都会返回一个新的LocalDate对象,也一样支持日期修改的链式操作。

LocalDate today = LocalDate.now();
System.out.println(today); // 2024-01-29

// 1.增加日期
LocalDate futureDay = today.plusYears(1).plusMonths(2).plusDays(3);
System.out.println(futureDay);// 2025-04-01

// 2.减少日期
LocalDate oldDay = today.minusDays(1).minusMonths(2).minusYears(3);
System.out.println(oldDay); //2020-11-28
  1. 比较日期 isBefore(),isAfter(),compareTo()
LocalDate d1 = LocalDate.of(2028, 1, 29);
LocalDate d2 = LocalDate.of(2028, 2, 1);
System.out.println(d1.isBefore(d2)); // true
System.out.println(d1.isAfter(d2)); // false
System.out.println(d1.compareTo(d2)); // -1

3. LocalDateTime 不可变日期时间对象

LocalDateTime 是 Java 8 中一个不可变的日期-时间对象,它表示了日期(年、月、日)和时间(小时、分钟、秒),但不包含时区

  1. 获取当前的日期和时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // 2024-01-29T17:08:53.401518100
  1. 创建指定日期时间的LocalDateTime对象
LocalDateTime dateTime = LocalDateTime.of(2024, 12, 9, 18, 22);
System.out.println(dateTime); // 2024-12-09T18:22
  1. 获取日期和时间的信息
System.out.println(now.getYear());
System.out.println(now.getMonth());
System.out.println(now.getDayOfMonth());
System.out.println(now.getHour());
System.out.println(now.getMinute());
System.out.println(now.getSecond());
System.out.println(now.getNano());
// ... 就不一一列举了
  1. 修改日期和时间 plus minus

同样的LocalDateTime对象也是不可变对象,当修改日期时间时,会创建新的LocalDateTime对象。并且同样,修改时间操作支持链式编程**。plus增加时间,minus减少时间。**

LocalDateTime changeDateTime = now.plusDays(1).minusHours(2).plusHours(1);
System.out.println(changeDateTime);
  1. 比较日期时间 isBefore、isAfter、compareTo
LocalDateTime dateTime1 = LocalDateTime.of(2028, 11, 24, 12, 30);
LocalDateTime dateTime2 = LocalDateTime.of(2028, 1, 26, 12, 30);

// 检查 dateTime1 是否在 dateTime2 之前
boolean isBefore = dateTime1.isBefore(dateTime2);
System.out.println(isBefore);  // 输出:false

// 检查 dateTime1 是否在 dateTime2 之后
boolean isAfter = dateTime1.isAfter(dateTime2);
System.out.println(isAfter);  // 输出:true

小结:
新的日期时间API,LocalTime,LocalDate,LocalDateTime都是不可变对象,每次操作修改值都会创建一个新的对象。
如果只是涉及时间,则使用LocalTime只涉及日期,使用LocalDate,日期时间都涉及,则使用LocalDateTime.
LocalTime,LocalDate,LocalDateTime三个类的操作基本一致,相对于Date更为灵活,简洁。

相关文章
|
10月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
8月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
326 0
|
10月前
|
存储 Java
Java LocalDateTime与hutool DateUtil实现秒转换为时分秒格式化展示。
注意:以上代码示例仅适合于处理小于24小时内(86400s) 总积 因 LocalDateTime 和 Local Time 不支持超过24小时表达而 huo tool示例虽然理论上支持但未考虑超过24小时情况下可能出现负值等异常情况处理细节需用户自行添加相关逻辑以确保正确性.
601 7
|
11月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
465 14
|
10月前
|
安全 Java API
Java日期时间API:从Date到Java.time
本文深入解析了Java 8中引入的全新日期时间API,涵盖LocalDate、LocalTime、LocalDateTime、ZonedDateTime等核心类的使用,以及时间调整、格式化、时区处理和与旧API的互操作。通过实例对比,展示了新API在可变性、线程安全与易用性方面的显著优势,并提供迁移方案与实战技巧,助你掌握现代Java时间处理的最佳实践。
|
10月前
|
JSON Java API
【干货满满】分享拼多多API接口到手价,用Java语言实现
本方案基于 Java 实现调用拼多多开放平台商品详情 API,通过联盟接口获取商品到手价(含拼团折扣与优惠券),包含签名生成、HTTP 请求及响应解析逻辑,适用于电商比价、导购系统集成。
|
10月前
|
JSON Java API
【干货满满】分享淘宝API接口到手价,用Java语言实现
本文介绍了如何使用 Java 调用淘宝开放平台 API 获取商品到手价,涵盖依赖配置、签名生成、HTTP 请求与响应解析等核心实现步骤。
|
11月前
|
JSON JavaScript 前端开发
Python+JAVA+PHP语言,苏宁商品详情API
调用苏宁商品详情API,可通过HTTP/HTTPS发送请求并解析响应数据,支持多种编程语言,如JavaScript、Java、PHP、C#、Ruby等。核心步骤包括构造请求URL、发送GET/POST请求及解析JSON/XML响应。不同语言示例展示了如何获取商品名称与价格等信息,实际使用时请参考苏宁开放平台最新文档以确保兼容性。
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现