使用 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...
我在 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...