Java中如何将Date输出的EEST时区改为EET?
Java中String转Date并指定EET时区的解决方案
核心说明
Date对象本质是时间戳,本身不存储时区信息,你看到的EEST是系统默认时区的夏令时标识。要输出EET格式,需要在解析和格式化时都指定目标时区,同时推荐使用Java 8+的新日期API替代过时的SimpleDateFormat。
方案1:使用旧API(SimpleDateFormat)
给SimpleDateFormat设置EET对应的时区,并且输出时不能直接用Date.toString()(会使用系统时区),要通过指定时区的格式化器输出:
String value = "20220307150417"; // 指定EET对应的完整时区ID(推荐用具体区域ID而非缩写) TimeZone eetTimeZone = TimeZone.getTimeZone("Europe/Istanbul"); // 解析时设置时区 DateFormat parser = new SimpleDateFormat("yyyyMMddHHmmss"); parser.setTimeZone(eetTimeZone); Date date = parser.parse(value); // 输出时用指定时区的格式化器 DateFormat outputFormatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); outputFormatter.setTimeZone(eetTimeZone); System.out.println(outputFormatter.format(date));
注意:不要直接用
TimeZone.getTimeZone("EET"),时区缩写可能存在歧义,优先使用Europe/Istanbul、Africa/Cairo这类完整时区ID。
方案2:使用Java 8+新API(推荐)
java.time包线程安全,API设计更清晰,是官方推荐的日期处理方式:
String value = "20220307150417"; DateTimeFormatter parser = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); // 解析为本地时间后绑定EET时区 LocalDateTime localDateTime = LocalDateTime.parse(value, parser); ZoneId eetZone = ZoneId.of("Europe/Istanbul"); ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, eetZone); // 格式化输出目标格式 DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy"); System.out.println(outputFormatter.format(zonedDateTime));
内容的提问来源于stack exchange,提问作者elvis
相关产品推荐
相关产品推荐

