java 8 引入的 java.time api 使用 zoneddatetime 类结合 datetimeformatter 来格式化带时区的时间。通过调用 zoneddatetime.format() 方法并传入包含 [vv](区域名称)或 xxx(偏移量)的模式,即可输出如 "asia/shanghai" 或 "+08:00" 格式的时区信息。

如何获取当前系统时区的 ZonedDateTime 对象?
要获取带有时区信息的日期时间对象,可以使用 ZonedDateTime.now() 方法。该方法默认使用系统的默认时区,返回一个包含完整时区信息的 ZonedDateTime 实例,这是后续格式化的基础。

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// 获取当前系统时区的 ZonedDateTime
ZonedDateTime now = ZonedDateTime.now();
System.out.println("ZonedDateTime: " + now);
// 定义格式化模式:包含区域名称 [VV] 和 偏移量 XXX
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV (XXX)");
String formatted = now.format(formatter);
System.out.println("Formatted: " + formatted);
}
}如何将特定时区的时间转换为目标时区并格式化?
如果需要将某个时间点转换到另一个时区进行格式化,可以使用 ZonedDateTime.withZoneSameInstant(ZoneId) 方法。这会创建一个新对象,其表示的瞬时时间与原对象相同,但时区已更改为指定的时区,然后再进行格式化输出。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
立即学习“Java免费学习笔记(深入)”;

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// 获取当前系统时区的 ZonedDateTime
ZonedDateTime shanghaiTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
// 转换为纽约时区
ZonedDateTime newYorkTime = shanghaiTime.withZoneSameInstant(ZoneId.of("America/New_York"));
// 定义格式化模式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss VV (XXX)");
System.out.println("Shanghai Time: " + shanghaiTime.format(formatter));
System.out.println("New York Time: " + newYorkTime.format(formatter));
}
}格式化模式中 [VV] 和 XXX 的区别是什么?
在 DateTimeFormatter 的模式中,[VV] 代表完整的区域名称(如 "Asia/Shanghai"),而 XXX 代表 ISO-8601 风格的时区偏移量(如 "+08:00")。两者可以同时出现在同一个模式中,以提供不同粒度的时区信息。

















