时间日期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更为灵活,简洁。

相关文章
|
存储 Java
Java LocalDateTime与hutool DateUtil实现秒转换为时分秒格式化展示。
注意:以上代码示例仅适合于处理小于24小时内(86400s) 总积 因 LocalDateTime 和 Local Time 不支持超过24小时表达而 huo tool示例虽然理论上支持但未考虑超过24小时情况下可能出现负值等异常情况处理细节需用户自行添加相关逻辑以确保正确性.
758 7
|
API
Date和SimpleDateFormat常用API
Date和SimpleDateFormat常用API
277 1
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
2135 5
|
Java
java-时间获取-LocalDateTime
java-时间获取-LocalDateTime
362 0
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
数据可视化 测试技术 API
从接口性能到稳定性:这些API调试工具,让你的开发过程事半功倍
在软件开发中,接口调试与测试对接口性能、稳定性、准确性及团队协作至关重要。随着开发节奏加快,传统方式已难满足需求,专业API工具成为首选。本文介绍了Apifox、Postman、YApi、SoapUI、JMeter、Swagger等主流工具,对比其功能与适用场景,并推荐Apifox作为集成度高、支持中文、可视化强的一体化解决方案,助力提升API开发与测试效率。
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
JSON 前端开发 API
如何调用体育数据足篮接口API
本文介绍如何调用体育数据API:首先选择可靠服务商并注册获取密钥,接着阅读文档了解基础URL、端点、参数及请求头,然后使用Python等语言发送请求、解析JSON数据,最后将数据应用于Web、App或分析场景,同时注意密钥安全、速率限制与错误处理。
1370 152
|
JSON API 数据安全/隐私保护
Python采集淘宝评论API接口及JSON数据返回全流程指南
Python采集淘宝评论API接口及JSON数据返回全流程指南