如何从用户获得有关时区的时间



美好的一天,

我正在研究项目报告。

,这是我第一次必须处理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

相关内容

  • 没有找到相关文章

最新更新