在Web上,日期为亚洲/香港格式(UTC + 8),但是当使用JSON格式传递到WildFly服务器时,在服务器调试模式下,日期字符串将变为UTC格式。 例如
web:2015年10月12日星期一00:00:00 GMT + 0800(香港标准时间)
WildFly服务器:2015-10-11T16:00:00.000Z
我想用java SimpleDateFormat将其解析回Asia / 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)= HKT 2015年10月11日08:00:00
sdf3.parse(dateUTC)= 2015年10月11日00:00:00 HKT
1)那么如何使输出成为“ 2015-10-12”? (因为香港是UTC + 8)?
2)有什么方法可以使服务器接收亚洲/香港格式的Web日期时间,但不能采用UTC日期时间格式?我尝试通过设置VM参数来设置WildFly java_opts
-Duser.timezone=Asia/Hong_Kong
但没有用,服务器仍以UTC格式接收日期时间。
答案 0 :(得分:2)
使用过时的Date
和SimpleDateFormat
类停止。使用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
使用旧的,过时的Date
和SimpleDateDateFormat
类,您不再应该使用的等效类将是
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