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

可能重复:
时区转换

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

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。 这是因为东京不遵守DST,而墨尔本也是如此。

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() – 它返回Date 。 正如之前所说 – Date实例不知道时区,因此东京和墨尔本设置丢失。

您可以尝试Joda-Time库 。 它们有两个函数叫做withZone()和withZoneRetainFields()来执行时区计算 。