【发布时间】:2011-02-21 19:41:55
【问题描述】:
我从 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 中操纵时间的经验吗?关于如何解决这个问题的更好的想法?
【问题讨论】:
-
我总是,永远,并且只使用唯一固定的单位来操纵日期(任何语言)。该单位是秒(或毫秒)。有 59 或 61 秒的分钟,有 23 或 25 小时的天。有 60*60 +/- 1 秒等小时。我所有的日期都存储为自纪元以来的(毫秒)秒。这就是它们在数据库中的方式,这就是它们的排序方式。我进行 timezone/yyyy-mm-dd 任何转换的唯一时间是当它需要显示给用户时(或者当使用不理解日期可以以秒为单位表示的损坏的 API 时)。
-
@WizardOfOdds。这是合理的建议,但 OP 清楚地发布了他从 Web 服务(可能是第 3 方)接收时间戳并使用第 3 方库来处理该请求。显然有些事情超出了他的直接控制范围,使用 java.util.Calendar 从时区转换到时区绝对不是直接的。
-
感谢您的 cmets。我正在使用 Axis 从 WSDL 文件生成 Web 服务存根。我正在使用生成的类连接到第三方 Web 服务。实际上,我认为他们应该使用时区信息或 UTC 传输日期时间字段,这是 Axis 所期望的。但这不是我的选择。
标签: java datetime calendar timezone