如何从用户那里获得时区的时间

时间:2018-04-26 21:34:33

标签: java time timezone utc gmt

美好的一天,

我正在进行项目报告。

这是我第一次处理日期时间。

我有数据库mongodb,因为我们知道mongodb以UTC格式存储日期时间。

现在我想显示用户提供的日期和时区的数据。

例如,如果我在我的系统中登录,我可以从下拉列表中设置我的时区。如果我选择日期开始和结束为2018-07-05和2018-07-06

,我现在选择GMT + 05:00

如何通过用户指定的时区获得适当的时间。

我猜如果用户选择时区GMT + 05:00,则日期必须从2018-07-04 19:00:00和2018-07-05 19:00:00开始减去给定时间后的5小时

我怎样才能实现这一点是java。

2 个答案:

答案 0 :(得分:1)

    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并将其以UTC格式存储在数据库中。

GMT+05:00不是真正的时区,而是GMT偏移量。如果您的用户位于始终使用相同UTC偏移的时区,则可以使用。但是政治家倾向于改变他们的想法,所以即使该时区不使用夏令时(DST),也可能在几年内完成。很多时区已经做到了。因此,您的用户应选择适当的时区,例如Asia/Tashkent

编辑:我从您的评论中了解到MongoDB需要一个java.util.Date对象。有趣和老式,但在这种情况下,当你知道如何转换是直截了当的:

    Date dbDate = Date.from(dbInstant);
    System.out.println(dbDate);

在我在欧洲/哥本哈根时区的电脑上打印出来:

  

Wed Jul 04 21:00:00 CEST 2018

不要被愚弄:这是正确的时间。 Date.toString(通过System.out.println隐式调用)获取我的JVM的时区设置并使用它来生成字符串。 Date本身没有时区,与Instant保持相同的时间点。

链接: Oracle tutorial: Date Time

答案 1 :(得分:0)

如果您已经拥有用户选择的时区,您需要做的是将日期从DB解析为GMT:

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