我的String
包含格式为08:00:00
这一次来自美国东部时间,我希望将其转换为伦敦的时区,并以String
的时间结束。
我已使用
将String
转换为时间
Time.valueOf(t);
然而,在此之后我无法改变时区。
答案 0 :(得分:3)
您可以使用 withZoneSameInstant
取代时间LocalTime myLocalTime = LocalTime.parse("08:00:00", DateTimeFormatter.ofPattern("HH:mm:ss"));
LocalTime londonTime = LocalDateTime.of(LocalDate.now(), myLocalTime).atZone(ZoneId.of("America/New_York"))
.withZoneSameInstant(ZoneId.of("Europe/London")).toLocalTime();
System.out.println(myLocalTime);
System.out.println(londonTime);
答案 1 :(得分:2)
关于这个问题有很多细节。
Time
类将日期(日,月和年)设置为1970年1月1日 st 。但是要从EST转换为伦敦当地时间,您必须考虑夏令时规则。
小时数的差异并不总是一样的;它可以根据日期而变化 - 考虑到今年(2017年):从1月1日起 st 到3月11日 th ,差异将是5小时,然后是3月12日< sup> th 至3月25日 th 差异为4小时,然后又回到5小时,然后在10月29日 th 它&#39 ; 4小时和11月5日 th 再次5小时,直到年底。
这是因为DST在时区和不同日期开始和结束。每年,这些日期也会发生变化,因此您需要知道您正在使用的日期,才能进行正确的转换。
另一件事是Java 8新API使用IANA timezones names(始终采用Region/City
格式,如America/Sao_Paulo
或Europe/Berlin
)。
避免使用3个字母的缩写(例如CST
或EST
),因为它们是ambiguous and not standard。
如果您正在使用 Java&lt; = 7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,ThreeTenABP(更多关于如何使用它here)。
以下代码适用于两者。
唯一的区别是包名称(在Java 8中为java.time
而在ThreeTen Backport(或Android的ThreeTenABP中)为org.threeten.bp
),但类和方法名称是一样的。
在下面的示例中,我使用America/New_York
- 其中一个many timezones that uses EST
(有超过30个时区使用或使用过它)。您可以致电ZoneId.getAvailableZoneIds()
查看所有时区,并选择最适合您情况的时区。
代码与@ΦXocę 웃 Пepeúpa ツ answer非常相似,因为它很简单,而且变化不大。我只想添加上面的见解。
// timezones for US and UK
ZoneId us = ZoneId.of("America/New_York");
ZoneId uk = ZoneId.of("Europe/London");
// parse the time string
LocalTime localTimeUS = LocalTime.parse("08:00:00");
// the reference date (now is the current date)
LocalDate now = LocalDate.now(); // or LocalDate.of(2017, 5, 20) or any date you want
// the date and time in US timezone
ZonedDateTime usDateTime = ZonedDateTime.of(now, localTimeUS, us);
// converting to UK timezone
ZonedDateTime ukDateTime = usDateTime.withZoneSameInstant(uk);
// get UK local time
LocalTime localTimeUK = ukDateTime.toLocalTime();
System.out.println(localTimeUK);
输出为13:00
(localTimeUK.toString()
的结果),因为如果值为零,toString()
将省略秒。
如果您想要始终输出秒数,可以使用DateTimeFormatter
:
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm:ss");
String time = fmt.format(localTimeUK);
在这种情况下,字符串time
将为13:00:00
。
LocalDate.now()
使用您系统的默认时区返回当前日期。如果您想要特定区域中的当前日期,您可以调用LocalDate.now(us)
(或您想要的任何区域,甚至明确使用默认值:LocalDate.now(ZoneId.systemDefault())
)