java SimpleDateFormat.parse a UTC time to Asia/Hong_Kong Tim



来自web,日期采用亚洲/Hong_Kong格式(UTC+8),但是当使用JSON格式传递给WildFly服务器时,在服务器调试模式下,日期字符串变为UTC格式。 例如

web:周一 十月 12 2015 00:00:00 GMT+0800 (香港标准时间)
野蝇服务器:2015-10-11T16:00:00.000Z

我想使用java SimpleDateFormat将其解析回亚洲/Hong_Kong格式,我尝试

String dateUTC="2015-10-11T16:00:00.000Z";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("sdf1.parse(dateUTC)="+sdf1.parse(dateUTC));
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
sdf2.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println("sdf2.parse(dateUTC)="+sdf2.parse(dateUTC));
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd");
sdf3.setTimeZone(TimeZone.getTimeZone("Asia/Hong_Kong"));
System.out.println("sdf3.parse(dateUTC)="+sdf3.parse(dateUTC));

我希望输出为"2015-10-12"但失败,输出为

sdf1.parse(dateUTC)=2015
年10月11日星期日 00:00:00 HKT sdf2.parse(dateUTC)=2015年10月11日星期日 08:00:00 HKT 2015 sdf3.parse(dateUTC)=2015
年10月11日星期日 00:00:00 HKT

1)那么如何使输出为"2015-10-12"呢?(因为香港是UTC+8)?

2)有什么方法可以使服务器可以接收亚洲/Hong_Kong格式的Web日期时间,但不能接收UTC日期时间格式?我尝试通过设置 VM 参数来设置 WildFly java_opts

-Duser.timezone=Asia/Hong_Kong

但没有使用,服务器仍以 UTC 格式接收日期时间。

停止使用过时的DateSimpleDateFormat类。 使用java.time包。

并意识到,如果你有一个完整的瞬间,精确到毫秒,并以标准ISO格式指定一个时区(Z表示UTC),那么你在解析它时不应该忽略所有的时间段和时区。解析整个事情:

String dateUTC = "2015-10-11T16:00:00.000Z";
Instant instant = Instant.parse(dateUTC);
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Asia/Hong_Kong"));
System.out.println(zonedDateTime.toLocalDate());
// prints 2015-10-12

等效的,使用旧的、过时的DateSimpleDateDateFormat类,你不应该再使用,将是

String dateUTC = "2015-10-11T16:00:00.000Z";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
Date parsed = sdf.parse(dateUTC);
SimpleDateFormat sdfHongKong = new SimpleDateFormat("yyyy-MM-dd");
sdfHongKong.setTimeZone(TimeZone.getTimeZone("Asia/Hong_Kong"));
System.out.println(sdfHongKong.format(parsed));
// prints 2015-10-12

最新更新