z表示通用时区缩写(如cst),依赖locale输出文字名称;z表示rfc 822偏移格式(如+0800),仅输出数字偏移,不依赖locale;二者必须显式settimezone才能正确生效,且z需配合locale实现本地化显示,z适用于机器交互。

Java中 SimpleDateFormat 的 z 和 Z 都用于表示时区,但含义、格式和适用场景完全不同,配置错误会导致输出混乱甚至解析失败。
z:通用时区名称(带文字描述)
z 表示“通用时区缩写”,如 CST、PST、JST;zzzz 则输出完整名称,如 中国标准时间、太平洋标准时间。它依赖系统默认或显式设置的 Locale,且对时区 ID 敏感。
- 单个
z→ 输出简写(如CST),但可能不唯一(多个时区共用同一缩写) - 四个
z(zzzz)→ 输出本地化全称,需配合Locale才能正确显示中文等语言 - 若未设时区(
setTimeZone),默认使用 JVM 本地时区;若设为UTC,z可能输出UTC或GMT
Z:RFC 822 时区偏移(纯数字格式)
Z 表示“RFC 822 格式的时区偏移”,固定为 ±HHMM 形式(无冒号),例如 +0800、-0500。它不依赖 Locale,只反映当前 SimpleDateFormat 绑定的时区对象的偏移量。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 单个
Z→ 输出+0800类格式,严格按偏移值计算 - 不能用
ZZ或ZZZ——多余字符会被忽略,仍等效于单个Z - 即使设了
TimeZone.getTimeZone("Asia/Shanghai"),Z也只输出+0800,不会变成文字
关键配置要点
要让 z 或 Z 正确生效,必须显式设置时区和区域:
- 调用
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"))指定时区(推荐用 IANA ID,而非"CST"这类模糊名) - 若用
z且需中文显示,构造时传入Locale.CHINA:new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z", Locale.CHINA) - 避免混用:
z适合面向用户展示(如日志、界面),Z更适合机器间交互(如 HTTP 头、API 参数) - 注意线程安全:SimpleDateFormat 非线程安全,多线程环境应避免共享实例,或改用
DateTimeFormatter(Java 8+)
常见错误示例
以下写法容易出错:
-
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z")未设时区 → 输出 JVM 本地时区的缩写,可能不是预期结果 -
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.CHINA)→Locale对Z无效,纯属冗余 -
sdf.format(new Date())前没调用setTimeZone→ 实际用的是系统默认时区,跨服务器部署时行为不一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










