将日期转换为不同的时区



我试图使用Java日期和日历从一个时区获得一个简单的转换。我正在尝试运行以下代码

    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小时...整个问题似乎很琐碎,但我找不到任何简单的答案。预先感谢您的帮助。

使用System.out.println(date); or System.out.println(instance2.getTime());打印日期时,instance2.getTime()返回的DateTimeZone 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()))

可接受的答案是正确的。java.util.date类没有分配的时区,但它是toString实现混乱地应用JVM的当前默认时区。

避免Java.util.date&.calendar

这是避免臭名昭著的麻烦java.util.util.date,.calendar和SimpleDateFormat类捆绑在一起的众多原因之一。避免他们。而是使用:

  • Joda Time
  • 新的Java.Time软件包与Java 8捆绑并受Joda Time的启发。

Joda Time

以下是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.Time

Java 8和后来有一个新的Java.Time内置。这个包裹的灵感来自Joda Time。当他们共享一些相似之处和班级名称时,它们是不同的。每个都有其他缺乏的特征。一个值得注意的区别是Java.Time避开构造函数,而是使用静态实例化方法。

在这个问题的情况下,它们以相同的方式工作。指定一个时区,并调用now方法以获取当前时刻,然后根据旧不变实例创建一个新实例以调整时区域。

注意两个不同的时区类。一个是一个指定的时区

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 do 在其源代码中埋藏了一个时区。但是班级出于大多数实际目的而忽略了该时区。因此,正如速记一样,经常说J.U. Date没有分配时区。令人困惑?是的。避免使用joda和/或java.time。

您可以使用以下代码段

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));

相关内容

  • 没有找到相关文章

最新更新