我在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发送实际的本地区域,我会尝试使用它。将更新..
答案 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);