如何从用户那里获取关于时区的时间

How to get time from user with respect to timezone

美好的一天,

我正在做项目汇报。

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

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

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

例如,如果我登录我的系统,我可以从下拉菜单中设置我的时区。假设我现在选择 GMT+05:00 如果我选择日期开始和结束为 2018-07-05 和 2018-07-06

如何获得用户指定时区的正确时间。

我想如果用户选择了时区 GMT+05:00 那么日期必须从 2018-07-04 19:00:00 和 2018-07-05 19:00:00 减去 5 小时给定时间。

我怎样才能做到这一点 java。

如果您已经让用户选择了时区,您需要做的是将日期从 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
    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);

在我的 Europe/Copenhagen 时区的计算机上打印:

Wed Jul 04 21:00:00 CEST 2018

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

保持相同的时间点

Link: Oracle tutorial: Date Time