使用java 8将时间转换为UTC

时间:2018-01-24 14:20:31

标签: java utc java-time timezone-offset

我在Java中有一些API,它们接受时间作为字符串。

UI发送像"10:00:00"这样的纯字符串。我正在创建一个LocalTime并保存在db(MySQL)中。

稍后在另一个API中,我使用LocalDate对象和上面的区域UTC时间创建一个保存到数据库的ZonedDateTime对象。我的问题是时间没有转换为UTC。

ZonedDateTime.of(LocalDate.now(ZoneId.of("UTC")),LocalTime.now(ZoneId.of("UTC")), ZoneId.of("UTC"));
ZonedDateTime.of(LocalDate.now(ZoneId.of("UTC")),dto.getStart(), ZoneId.of("UTC"));

这两个都不同,虽然我发送的是07:00:00,这是我在印度的时间。请指导我如何将时间单独转换为UTC。

编辑::我已将jvm Duser.Timezone设置为UTC。当我这样做时:

ZonedDateTime.of(LocalDate.now(ZoneId.of("UTC")),dto.getStart(), ZoneId.of("UTC")).getOffset().getTotalSeconds();

它以秒为单位

EDIT ::

ZoneId z = ZoneId.of("Asia/Calcutta");
ZoneId z1 = ZoneId.of("UTC");
TimeZone.getTimeZone(z).getRawOffset();

试过这个,它以毫秒为单位给出差异。如果UI发送实际的本地区域,我会尝试使用它。将更新..

3 个答案:

答案 0 :(得分:1)

如果输入对应于您当地的时间,您可以创建ZonedDateTime以获取印度时区的当前日期,设置时间然后将其转换为UTC:

LocalTime time = LocalTime.parse("10:00:00"); // 10 AM

ZonedDateTime utc = ZonedDateTime
    .now(ZoneId.of("Asia/Calcutta")) // current date/time in India
    .with(time) // set time to 10 AM
    .withZoneSameInstant(ZoneOffset.UTC); // convert to UTC

变量utc的值为2018-01-29T04:30Z(今天运行代码,1月29日)。 UTC的时间是凌晨4:30,相当于印度的上午10点。

我认为MySQL无法保存ZonedDateTime,因此您可以先调用Instant将其转换为utc.toInstant()。或者,如果您使用的驱动程序是旧版本且仅适用于java.util.Date,则可以使用Date.from(utc.toInstant())进行转换。

另请注意,我使用常量ZoneOffset.UTC,相当于(但比IMO更好)调用ZoneId.of("UTC")

答案 1 :(得分:1)

现在我们决定允许用户界面将时间更改为其时区。服务器的JVM时区设置为UTC ...

答案 2 :(得分:0)

我建议不要在ZatabaseDateTime中存储ZonedDateTime。 MySQL时间戳不会存储时区信息,因此您无法保证在保存的同时返回。

相反,我会在内部时间存储一个LocalDateTime并标准化UTC,然后在需要显示时用时区格式化。要获得UTC的当前时间,你可以这样做。

LocalDateTime now = LocalDateTime.now(Clock.systemUTC());

要为今天和提供的时间构建UTC时间戳,您可以执行类似的操作。

LocalTime time = getTime();
LocalDateTime = LocalDateTime.of(LocalDate.now(Clock.systemUTC()), time);

使用当前时区的日期,提供的时间构建时间戳,然后转换为UTC以保存到数据库。

ZoneId timezone = ZoneId.of("Asia/Calcutta");
LocalTime time = getTime();
ZonedDateTime zdt = ZonedDateTime.of(LocalDate.now(timezone), time, timezone);
LocalDateTime utcDateTime = LocalDateTime.ofInstant(zdt.toInstant(), ZoneOffset.UTC);