如何将数据从1个时区转换为另一个时区?

时间:2011-10-08 09:16:15

标签: java

  

可能重复:
  Timezone conversion

我有一个UTC日期,如何将其转换为其他时区?

2 个答案:

答案 0 :(得分:35)

java.util.Date

尽管Date.toString()的输出显示,但Date个实例 时区感知。它们只代表一个时间点,与时区无关。因此,如果您有Date实例,则无需执行任何操作。如果你在一个时区有时间并且想知道其他时区的时间是什么怎么办?你需要

java.util.Calendar中

Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("Asia/Tokyo"))
cal.set(Calendar.HOUR_OF_DAY, 15)  //15:00 in Tokyo
cal.set(Calendar.MONTH, Calendar.NOVEMBER)

cal.setTimeZone(TimeZone.getTimeZone("Australia/Melbourne"))
cal.get(Calendar.HOUR_OF_DAY)  //17:00 in Melbourne

请注意,更改时区后,日期(时间点)未更改。仅表示(此特定时区的当前小时)。还要注意11月在那里很重要。如果我们将月份改为7月突然,墨尔本的小时变为16:00。那是因为东京不遵守夏令时,而墨尔本也是如此。

java.text.DateFormat中

Java中还有另一个带时区的问题。当您尝试格式化日期时,需要明确指定时区:

DateFormat format = DateFormat.getTimeInstance
format.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"))

否则DateFormat总是使用当前计算机的时区,这通常是不合适的:

format.format(cal.getTime())

由于format()方法不允许Calendar个实例(即使它接受Object作为参数 - sic!),您必须调用Calendar.getTime() - 返回{{ 1}}。正如之前所说 - Date实例不知道时区,因此东京和墨尔本的设置都丢失了。

答案 1 :(得分:4)

您可以尝试Joda-Time library。它们有两个名为withZone()和withZoneRetainFields()的函数来执行timezone calculations