我正在尝试使用Java Date和Calendar获得从一个时区到另一个时区的简单转换。我正在尝试运行以下代码
Calendar instance = Calendar.getInstance(TimeZone.getTimeZone("Europe/London"));
Date date = instance.getTime();
System.out.println(date);
GregorianCalendar instance2 = new GregorianCalendar(TimeZone.getTimeZone("Europe/Athens"));
instance2.setTime(instance.getTime());
System.out.println(instance2.getTime());
但是仍然会返回相同的日期,而不是+1小时...整个问题似乎微不足道,但我找不到任何简单的答案。在此先感谢您的帮助。
答案 0 :(得分:36)
使用System.out.println(date); or System.out.println(instance2.getTime());
打印日期时,Date
返回的instance2.getTime()
为TimeZone independent
,并始终以当地时区打印日期。
相反,您可能想要使用DateFormat/SimpleDateFormat
:
DateFormat formatter= new SimpleDateFormat("MM/dd/yyyy HH:mm:ss Z");
formatter.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(formatter.format(date));
formatter.setTimeZone(TimeZone.getTimeZone("Europe/Athens"));
System.out.println(formatter.format(instance2.getTime()))
答案 1 :(得分:13)
接受的答案是正确的。 java.util.Date类没有分配†的时区,但它的toString
实现容易混淆地应用JVM的当前默认时区。
这是避免与Java捆绑的臭名昭着的java.util.Date,.Calendar和SimpleDateFormat类的众多原因之一。避免他们。而是使用:
Joda-Time 2.3中的一些示例代码如下。搜索StackOveflow以获取更多示例和讨论。
DateTimeZone timeZoneLondon = DateTimeZone.forID( "Europe/London" );
DateTimeZone timeZoneAthens = DateTimeZone.forID( "Europe/Athens" );
DateTime nowLondon = DateTime.now( timeZoneLondon );
DateTime nowAthens = nowLondon.withZone( timeZoneAthens );
DateTime nowUtc = nowLondon.withZone( DateTimeZone.UTC );
Java 8及更高版本内置了一个新的java.time package。这个包的灵感来自Joda-Time。虽然它们有一些相似之处和类名,但它们是不同的;每个都有其他缺乏的功能。一个值得注意的区别是java.time避免使用构造函数,而是使用静态实例化方法。
就本课题而言,它们的工作方式相同。指定一个时区,并调用now
方法获取当前时刻,然后根据旧的不可变实例创建一个新实例以调整时区。
请注意两个不同的时区类。一个是命名时区,包括夏令时的所有规则和其他此类异常加上与UTC的偏移,而另一个只是偏移。
ZoneId zoneMontréal = ZoneId.of("America/Montreal");
ZonedDateTime nowMontréal = ZonedDateTime.now ( zoneMontréal );
ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo");
ZonedDateTime nowTokyo = nowMontréal.withZoneSameInstant( zoneTokyo );
ZonedDateTime nowUtc = nowMontréal.withZoneSameInstant( ZoneOffset.UTC );
†实际上java.util.Date
类确实的时区埋没在its source code之内。但是为了大多数实际目的,该课程忽略了该时区。因此,作为速记,经常说j.u.Date没有指定时区。混乱?是。避免混乱是j.u.Date并使用Joda-Time和/或java.time。
答案 2 :(得分:2)
您可以使用以下代码段
String dateString = "14 Jul 2014 00:11:04 CEST";
date = formatter.parse(dateString);
System.out.println(formatter.format(date));
// Set the formatter to use a different timezone - Indochina Time
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Bangkok"));
System.out.println("ICT time : "+formatter.format(date));