可能重复:
Timezone conversion
我有一个UTC日期,如何将其转换为其他时区?
答案 0 :(得分:35)
尽管Date.toString()
的输出显示,但Date
个实例 时区感知。它们只代表一个时间点,与时区无关。因此,如果您有Date
实例,则无需执行任何操作。如果你在一个时区有时间并且想知道其他时区的时间是什么怎么办?你需要
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中还有另一个带时区的问题。当您尝试格式化日期时,需要明确指定时区:
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。