Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将日期转换为不同的时区_Java_Date_Datetime_Calendar_Timezone - Fatal编程技术网

Java 将日期转换为不同的时区

Java 将日期转换为不同的时区,java,date,datetime,calendar,timezone,Java,Date,Datetime,Calendar,Timezone,我试图使用Java日期和日历实现从一个时区到另一个时区的简单转换。我正在尝试运行以下代码 Calendar instance = Calendar.getInstance(TimeZone.getTimeZone("Europe/London")); Date date = instance.getTime(); System.out.println(date); GregorianCalendar instance2 = new GregorianCalend

我试图使用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(日期)打印日期时;或System.out.println(instance2.getTime())
,由
instance2.getTime()
返回的
日期
与时区无关,并且总是在本地时区中打印日期

相反,您可能希望使用
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()))

您可以使用以下代码段

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

公认的答案是正确的。java.util.Date类没有指定时区†,但它的
toString
实现混淆地应用了JVM的当前默认时区

避免使用java.util.Date和.Calendar 这是避免与java捆绑在一起的众所周知的麻烦的java.util.Date、.Calendar和SimpleDataFormat类的众多原因之一。避开它们。相反,请使用以下任一选项:

  • 新版本与Java8捆绑在一起,灵感来自Joda Time
乔达时间 下面是Joda Time2.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 Java8及更高版本有一个新的内置接口。此套餐的灵感来自Joda Time。虽然它们有一些相似之处和类名,但它们是不同的;每一个都有另一个所缺乏的特点。一个显著的区别是java.time避免使用构造函数,而是使用静态实例化方法

在这个问题上,它们以同样的方式工作。指定时区,并调用方法获取当前时刻,然后基于旧的不可变实例创建一个新实例以调整时区

请注意这两个不同的时区类别。一个是命名时区,包括夏令时和其他此类异常的所有规则,加上与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
类中确实有一个时区。但出于最实际的目的,该类忽略了时区。所以,简而言之,人们常说j.u.Date没有指定时区。令人困惑对避免j.u.Date的混乱,选择Joda Time和/或java.Time。

您想使用它吗?这是我的偏好。检查。我在网上找到了另一种可能是最干净的解决方案,使用日期-时间格式解析日期字符串并返回相应时区中的日期。你确定这是本地时区而不是纪元秒(时区独立)@如果内部表示是从epoch开始的,当打印日期时使用本地时区,
java.util.date
@Bober02:您找到更好的功能/错误了吗?如果是,请共享。显然,formatter.format(instance2.getTime())会更改时区,但当我们将此字符串日期转换回日期对象时,它会再次拾取本地时区。有什么解决办法吗?@ParkashKumar:Date是时区独立的,所以你有两种解决方法。1.调整偏移量以使用时区相关值处理本地日期。2.使用具有正确处理方式的时区相关对象。