[总结/更新中]java 8 中的时间、日期处理类

本文详细介绍了Java8中引入的新时间日期API,包括LocalDate、LocalTime、LocalDateTime、ZonedDateTime等关键类,以及它们的用途、操作和与旧版API的区别。同时涵盖了类型转换、日期格式化等内容,展示了API如何简化日期时间处理和提升代码可读性。
摘要由CSDN通过智能技术生成

导言

Java 8 引入了一套全新的时间日期API,这些API在java.time包下,它们解决了旧版java.util.Date类和java.util.Calendar类的线程安全问题,并提供了更为丰富和灵活的功能。以下是Java 8中时间日期处理的关键类:

  1. LocalDate:表示没有时间和时区的日期,如2024-01-08。

  2. LocalTime:表示没有日期和时区的时间,如10:15:30。

  3. LocalDateTime:表示没有时区的日期和时间,结合了LocalDateLocalTime,如2024-01-08T10:15:30。

  4. ZonedDateTime:表示带时区的日期和时间,它是在LocalDateTime的基础上加上了时区信息。

  5. Instant:表示时间线上的一个瞬时点,通常用于生成时间戳。

  6. Duration:表示两个时间之间的时长,用于计算两个LocalTime、两个Instant或两个LocalDateTime之间的差异。

  7. Period:表示两个日期之间的时长,用于计算两个LocalDate之间的差异。

  8. DateTimeFormatter:用于日期时间的格式化和解析。

  9. Clock:提供对当前日期和时间的访问,可以用于替代System.currentTimeMillis()TimeZone.getDefault()

这些类都是不可变且线程安全的,可以通过其提供的各种工厂方法来创建实例,也提供了丰富的方法用于日期时间的计算、解析和格式化。例如:

// 获取当前日期
LocalDate today = LocalDate.now();

// 创建一个日期
LocalDate someDate = LocalDate.of(2024, Month.JANUARY, 8);

// 在现有日期的基础上增加天数
LocalDate tomorrow = today.plusDays(1);

// 解析日期字符串
LocalDate anotherDate = LocalDate.parse("2024-01-08");

// 格式化日期
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String formattedDate = today.format(formatter);

// 获取当前时间戳
Instant now = Instant.now();

// 日期时间的计算
Duration duration = Duration.between(startTime, endTime);
Period period = Period.between(startDate, endDate);

Java 8的这套时间日期API大大简化了时间日期的处理,并且让代码更加清晰易读。

一、类型转换

常用的是java.util.Date和java.time.LocalDate之间的转换,而要在java.util.Date和Java 8中的java.time.LocalDate之间进行转换,你需要考虑到Date是带有时间和时区的,而LocalDate仅包含日期信息,没有时间和时区的概念。下面是如何在两者之间进行转换的方法:

 1.Date 转换为 LocalDate

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

在这里,我们首先将Date对象转换为Instant,然后将Instant与系统默认时区结合以创建ZonedDateTime对象,最后我们调用toLocalDate方法来获取LocalDate对象。

2.LocalDate 转换为 Date

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;

LocalDate localDate = LocalDate.now();
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

 

这里,我们首先将LocalDate转换为当天开始时的LocalDateTime,然后将其与系统默认时区结合,创建一个ZonedDateTime对象。最后,我们通过调用toInstant方法并传递该瞬时值给Date.from方法来创建一个Date对象。

需要注意的是,在转换过程中,由于LocalDate不包含时间信息,所以默认转换为Date时会将时间设置为午夜开始(00:00:00)。同样,由于Date包含时区信息,而LocalDate不包含,所以必须指定一个时区来进行准确的转换,通常使用系统默认时区ZoneId.systemDefault()。如果你需要处理其他时区,可以替换为对应的ZoneId

二、日期格式化

在Java中,时间格式化通常是指将日期时间对象转换为特定格式的字符串。Java提供了DateTimeFormatter类来进行日期时间的格式化。以下是一些常用的时间格式化模式:

1.ISO 标准格式:

  • DateTimeFormatter.ISO_LOCAL_DATE2024-01-08
  • DateTimeFormatter.ISO_LOCAL_TIME11:56:15
  • DateTimeFormatter.ISO_LOCAL_DATE_TIME2024-01-08T11:56:15
  • DateTimeFormatter.ISO_OFFSET_DATE_TIME2024-01-08T11:56:15+01:00
  • DateTimeFormatter.ISO_ZONED_DATE_TIME2024-01-08T11:56:15+01:00[Europe/Paris]

2.自定义格式:

  • yyyy-MM-dd2024-01-08 (年-月-日)
  • dd/MM/yyyy08/01/2024 (日/月/年)
  • MM-dd-yyyy HH:mm01-08-2024 11:56 (月-日-年 时:分)
  • EEEE, MMMM dd, yyyyTuesday, January 08, 2024 (星期, 月份 日, 年)
  • hh:mm a11:56 AM (时:分 上午/下午)
  • HH:mm:ss11:56:15 (时:分:秒)
  • yyyy-MM-dd'T'HH:mm:ss.SSSXXX2024-01-08T11:56:15.000Z (年-月-日T时:分:秒.毫秒时区)

3.DateTimeFormatter

 使用DateTimeFormatter进行格式化,可以使用其静态方法ofPattern创建一个格式化器,然后调用日期时间对象的format方法。例如:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

LocalDateTime now = LocalDateTime.now();

// 使用自定义格式化
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = now.format(formatter);
System.out.println(formatted);

 也可以直接使用预定义的格式化器,例如:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

LocalDate today = LocalDate.now();

// 使用预定义的ISO_LOCAL_DATE格式化器
String formatted = today.format(DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(formatted);

4.Date

对于java.util.Date对象,需要使用SimpleDateFormat类来格式化日期。

import java.text.SimpleDateFormat;
import java.util.Date;

Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = formatter.format(date);
System.out.println(formattedDate); 

5.LocalDate 

对于java.time.LocalDate对象,应该使用DateTimeFormatter类来格式化日期。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

LocalDate localDate = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formattedDate = localDate.format(formatter);
System.out.println(formattedDate); 

注意事项

  • 当使用SimpleDateFormat时,请注意它不是线程安全的,所以如果在多线程环境中,每个线程应该有自己的SimpleDateFormat实例或者使用同步机制。
  • DateTimeFormatter是不可变的和线程安全的,所以它可以被多个线程共享使用。
  • 格式化模式字符串(如"yyyy-MM-dd HH:mm:ss")是大小写敏感的,所以MM代表月份,而mm代表分钟,yyyy代表四位年份,而yy代表两位年份。
  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值