如何从用户那里获取关于时区的时间
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
.
保持相同的时间点
美好的一天,
我正在做项目汇报。
这是我第一次必须处理日期时间。
我有数据库 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
.