使用 java 8 将时间转换为 UTC

Converting time to UTC using java 8

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

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

稍后在另一个 API 中,我使用 LocalDate 对象和上述时间与 Zone 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.When 我这样做:

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

秒数为 0

编辑::

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

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

我建议不要将 ZonedDateTime 存储在 MySQL 数据库中。 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);

如果输入对应于您的当地时间,您可以创建一个 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 AM,相当于印度的上午 10 点。

我相信MySQL不能保存一个ZonedDateTime,所以你可以先调用utc.toInstant()把它转换成一个Instant。或者,如果您使用的驱动程序是旧版本并且它仅适用于 java.util.Date,您可以使用 Date.from(utc.toInstant()).

转换它

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

目前我们已决定允许 UI 将时间更改为其时区。服务器的 JVM 时区设置为 UTC...