如何将数据从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()来执行时区计算 。