如何本地化日期格式MM/dd/yyyy HH:mm:ss a z中的时区标识'z'
搞定短时区标识
z的本地化显示问题 我太懂这个坑了!SimpleDateFormat的短时区标识z根本不支持完整的本地化映射,哪怕你指定了日语Locale,它还是会输出时区的原始缩写(比如你看到的EDT),完全达不到预期效果。
最优解:切换到Java 8+的java.time API
Java 8推出的新日期时间API(JSR-310)彻底解决了旧API的一堆糟心事,DateTimeFormatter能完美根据Locale本地化短时区标识。直接上代码:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; import java.time.ZoneId; public class LocalizedDateTimeDemo { public static void main(String[] args) { // 定义你要的格式 String pattern = "MM/dd/yyyy HH:mm:ss a z"; // 指定日语区域设置 Locale jaJpLocale = new Locale("ja", "JP"); // 创建本地化的格式化器 DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern, jaJpLocale); // 获取美国东部时区的当前时间(对应EDT) ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/New_York")); // 输出结果,时区会显示日语本地化的短标识 System.out.println(formatter.format(now)); } }
运行这段代码,你会得到类似04/01/2018 17:15:23 午後 米国東部夏時間的输出(具体短时区名称取决于JDK的本地化数据,但肯定是日语形式,不再是EDT)。
为啥SimpleDateFormat不行?
说白了就是旧API的设计缺陷——SimpleDateFormat的z字段用的是硬编码的时区缩写,不管你指定什么Locale,它只会输出时区ID自带的原始缩写(比如EDT、EST),不会做本地化转换。哪怕你用zzzz能拿到完整的本地化时区名称,z就是死活不配合。
迫不得已用旧Java版本?试试这个临时方案
如果项目还停留在Java 7及以下,那只能手动搞个映射表来替换时区缩写了,虽然麻烦但能应急:
import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Map; import java.util.HashMap; public class LegacyLocalizedTimeZone { public static void main(String[] args) { String pattern = "MM/dd/yyyy HH:mm:ss a z"; SimpleDateFormat dateFormat = new SimpleDateFormat(pattern, new Locale("ja", "JP")); Date date = new Date(); String result = dateFormat.format(date); // 手动维护时区缩写的日语映射 Map<String, String> zoneAbbrMap = new HashMap<>(); zoneAbbrMap.put("EDT", "米東夏"); zoneAbbrMap.put("EST", "米東冬"); // 可以继续添加其他需要支持的时区缩写 // 替换原始缩写为日语版本 for (Map.Entry<String, String> entry : zoneAbbrMap.entrySet()) { result = result.replace(entry.getKey(), entry.getValue()); } System.out.println(result); } }
不过这种方式需要你自己维护所有可能出现的时区缩写,扩展性很差,能升级Java版本的话还是优先用新API。
内容的提问来源于stack exchange,提问作者sarayu
相关产品推荐
相关产品推荐

