将String转换为时间,更改时区,然后返回String

时间:2017-07-12 12:12:41

标签: java datetime time timezone converter

我的String包含格式为08:00:00

的时间

这一次来自美国东部时间,我希望将其转换为伦敦的时区,并以String的时间结束。

我已使用

String转换为时间
Time.valueOf(t);

然而,在此之后我无法改变时区。

2 个答案:

答案 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_PauloEurope/Berlin)。 避免使用3个字母的缩写(例如CSTEST),因为它们是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:00localTimeUK.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())