java - 更改时区而不更改Java中的时间

标签 java datetime calendar timezone

我从没有时区信息的 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/

相关文章:

java - scala -> java getField().get()

java - 如何使数据库更改导致 Web 客户端 View 的更新

java - Java中的线程池有什么用?

python - MySQL Python 不正确的日期时间值

java - 从 Selenium Webdriver WebElement 字段中检索值并将其传递给 java 变量

c# - 是否有一种文化安全的方法来获取带前导零的 ToShortDateString() 和 ToShortTimeString()?

javascript - 如何在javascript中将日期(1567074191725)转换为日期

java - 日历网格布局

带有 CalendarProvider 的 Android SyncAdapter

c# - 在 ajax 日历扩展器控件中禁用周末和国定假日