来自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 格式接收日期时间。
停止使用过时的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