【问题标题】:How to get time from user with respect to timezone如何从用户那里获取关于时区的时间
【发布时间】:2018-10-07 16:40:09
【问题描述】:

早安,

我正在做一个项目报告。

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

我有数据库 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。

【问题讨论】:

  • 我认为您无法在后端获取此信息。您需要一个客户端方法来获取时区。
  • 我已经在会话中存储了用户选择的时区
  • Java 8 为此提供了很多不错的时间类。您可以使用 Instant.ofEpochSecond 或类似方法将 UNIX 纪元值转换为 Instant,然后通过 atZone 方法转换为 ZonedDateTime。区域来自TimeZone.getTimeZone(String).toZoneId。然后使用 DateTimeFormatter 格式化。
  • (a) 举例说明你的输入和输出。 (b) 数以千计的现有日期时间问题和答案如何没有满足您的需求?

标签: java time timezone utc gmt


【解决方案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);

在我位于欧洲/哥本哈根时区的计算机上打印:

2018 年 7 月 4 日星期三 21:00:00 CEST

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

链接: Oracle tutorial: Date Time

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我在字符串日期中从用户那里获取日期
    • LocalDateTime 是用于此目的的错误类。它缺乏任何时区或与 UTC 偏移的概念。所以它确实代表一个时刻,时间线上的一个特定点。
    猜你喜欢
    • 2014-02-07
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 2019-01-22
    相关资源
    最近更新 更多