我从没有时区信息的 SOAP 网络服务接收日期时间。因此,Axis 解串器采用 UTC。但是,日期时间确实是悉尼时间。我通过减去时区偏移量解决了这个问题:
Calendar trade_date = trade.getTradeDateTime();
TimeZone est_tz = TimeZone.getTimeZone("Australia/Sydney");
long millis = trade_date.getTimeInMillis() - est_tz.getRawOffset();
trade_date.setTimeZone( est_tz );
trade_date.setTimeInMillis( millis );
但是,我不确定这个解决方案是否也考虑了夏令时。我认为应该,因为所有操作都在 UTC 时间。有在 Java 中操作时间的经验吗?关于如何解决这个问题的更好的想法?
最佳答案
我可怜那些不得不用 Java 做约会的傻瓜。
您所做的几乎肯定会在夏令时转换期间出错。最好的方法可能是创建一个新的 Calendar 对象,在其上设置时区,然后单独设置所有字段,所以年、月、日、小时、分钟、秒,从 Date 对象获取值.
编辑:
为了让每个人都开心,您可能应该这样做:
Calendar utcTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Calendar sydneyTime = Calendar.getInstance(TimeZone.getTimeZone("Australia/Sydney");
utcTime.setTime(trade_date);
for (int i = 0; i < Calendar.FIELD_COUNT; i++) {
sydneyTime.set(i, utcTime.get(i));
}
那么您将不会使用任何已弃用的方法。
关于java - 更改时区而不更改Java中的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2873119/