美好的一天,
我正在研究项目报告。
,这是我第一次必须处理DateTime。
我有数据库MongoDB,正如我们知道MongoDB在UTC中存储的日期时间
现在我想显示来自用户提供日期和时区的数据。
例如,如果我在系统中登录,我可以从下拉列表中设置时区。说我选择GMT 05:00如果我选择日期开始和结束,则为2018-07-05和2018-07-06
如何使用用户指定的时区获得适当的时间。
我猜想如果用户选择了时区GMT 05:00,那么日期必须从2018-07-04 19:00:00和2018-07-07-05 19:00:00从给定时间起5小时。
我该如何实现这一点是Java。
String userTimeZone = "Asia/Samarkand";
String userDate = "2018-07-05";
ZoneId zone = ZoneId.of(userTimeZone);
Instant dbInstant = LocalDate.parse(userDate)
.atStartOfDay(zone)
.toInstant();
System.out.println(dbInstant);
这打印了您的预期:
2018-07-04T19:00:00z
我不知道MongoDB的JDBC驱动程序,但我认为很乐意接受Instant
并将其存储在数据库中。
GMT+05:00
并不是真正的时区,而是GMT偏移。如果您的用户始终处于使用相同的UTC偏移的时区,则它将起作用。但是政客倾向于改变主意,因此,即使那个时区不使用夏季时间(DST(,也可能会在几年内完成。而且已经很多时区已经做到了。因此,您的用户应该选择一个正确的时区,例如Asia/Tashkent
。
编辑:我从您的评论中了解MongoDB期望java.util.Date
对象。有趣而老式,但是在这种情况下,当您知道如何:
Date dbDate = Date.from(dbInstant);
System.out.println(dbDate);
在我在欧洲/哥本哈根时区的计算机上印刷的时区:
星期三7月4日21:00:00 Cest 2018
不要上当:这是正确的时间。Date.toString
(通过System.out.println
隐式调用(抓住我的JVM的时区设置并使用它来生成字符串。Date
本身没有时区,并且与Instant
相同的时间点。
链接: oracle教程:日期时间
如果您已经拥有用户选择的时区
Date dateFromDb = getDateFromDb(); // date from db
LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.of("GMT")); // parsing date to GMT but using LocalDateTime
Date correctDate = Date.from(localDateTime); // transforming into java.util.Date