当然,下面是一个Java工具类 DateUtils
的示例,它包含了将给定的ISO 8601格式的时间字符串转换为北京时区(UTC+8)的 java.util.Date
类型的方法。这个工具类还包括了一些辅助方法,以便于日期和时间的处理。
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class DateUtils {
private static final String BEIJING_ZONE_ID = "Asia/Shanghai";
private static final DateTimeFormatter ISO_DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");
private static final DateTimeFormatter DATE_ONLY_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 将ISO 8601格式的时间字符串转换为北京时区的Date类型
public static Date convertIsoToBeijingDate(String isoDateTime) {
// 解析ISO 8601时间字符串为Instant
Instant instant = Instant.from(ISO_DATE_TIME_FORMATTER.parse(isoDateTime));
// 转换为北京时区的ZonedDateTime
ZonedDateTime beijingDateTime = instant.atZone(ZoneId.of(BEIJING_ZONE_ID));
// 获取当天开始时刻的Instant,并转换为Date
return Date.from(beijingDateTime.toLocalDate().atStartOfDay(ZoneId.of(BEIJING_ZONE_ID)).toInstant());
}
// 将Date对象格式化为"YYYY-MM-DD"字符串
public static String formatDate(Date date) {
if (date == null) {
return null;
}
return date.toInstant().atZone(ZoneId.of(BEIJING_ZONE_ID)).format(DATE_ONLY_FORMATTER);
}
// 主方法用于测试
public static void main(String[] args) {
// 测试转换
String isoDateTime = "2024-10-15T16:00:00.000Z";
Date beijingDate = convertIsoToBeijingDate(isoDateTime);
System.out.println("Converted Date: " + beijingDate);
// 测试格式化
String formattedDate = formatDate(beijingDate);
System.out.println("Formatted Date: " + formattedDate); // 应该输出:2024-10-16
}
}
工具类说明
-
convertIsoToBeijingDate 方法:
- 接受一个ISO 8601格式的时间字符串。
- 使用
DateTimeFormatter
解析该字符串为Instant
对象。 - 将
Instant
对象转换为北京时区的ZonedDateTime
。 - 提取日期部分并转换为当天开始时刻的
Instant
。 - 最后返回
java.util.Date
类型的对象。
-
formatDate 方法:
- 接受一个
java.util.Date
对象。 - 将其转换为北京时区的
LocalDate
并格式化为 “YYYY-MM-DD” 格式的字符串。
- 接受一个
-
main 方法:
- 用于测试上述两个方法的功能。
你可以根据需要扩展这个工具类,添加更多的日期处理方法。