首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在java中跨多个系统管理时区?

如何在java中跨多个系统管理时区?
EN

Stack Overflow用户
提问于 2020-06-02 14:17:07
回答 1查看 223关注 0票数 0

我有一个web应用程序,它根据事件发生的国家返回预订时间。

如果预订是在India at 02-JUNE-2020 1700 IST创建的,那么返回的时间是:

代码语言:javascript
运行
复制
2020-06-02T17:00:00+0530

如果预订是在泰国在02-JUNE-2020 1700泰国时间创建的,那么返回的时间是:

代码语言:javascript
运行
复制
2020-06-02T17:00:00+0700  

现在,我必须将所有这些存储在英国时间的一个系统中,因此数据如下:

India,in UK system:2020-06-02T12:30:00+0100

泰国,英国系统:2020-06-02T11:00:00+0100

我知道我可以使用区域指示符+0530转换为毫秒偏移,通过使用

代码语言:javascript
运行
复制
TimeZone.getAvailableIDs(milliseconds);

并找到相应的时区进行反向集成。

但是,有什么简单的方法可以直接用java把IST翻译成英国时间呢?

EN

回答 1

Stack Overflow用户

发布于 2020-06-02 14:38:50

+0530实际上并不表示任何特定的时区。一个时区可以是,比如说,Europe/Amsterdam。这是冬季的+0100和夏季的+0200,而Europe/Paris带在相同的日期具有完全相同的偏移量。虽然可能性不大,但5年后完全有可能不再是这种情况。请注意,+0100没有准确地描述Europe/Amsterdam (在夏天是错误的),并且不能消除阿姆斯特丹和巴黎之间的歧义,这就是为什么通常情况下它不够好的原因。如果这正是您所得到的并且您无法更改它,那么getAvailableID是至少尝试将+0530转换为一个区域的一种方法,但是请注意,通常您会得到很多答案,所以我不知道如何选择‘正确’区域。考虑更改系统,这样就可以得到这个时区,完整的ID,作为输入的一部分。

假设你已经得到了区域,不知何故。

给定2020-06-02T17:00:00+0530,您可以将其转换为由此时间戳描述的事件已经/将要发生的确切时刻。这大概很重要,如果你想让警报在那个时候在地球上的任何地方响,你现在就可以做到这一点。你储存这个“英国时间”只是一个实现细节,这并不重要:你在存储这个事件发生的时间,而不是创建这个时间戳的面向人类的系统所指的方式(大概是:‘在晚上5点,在2020年的6月2日,在印度’)。

但是,您表示需要将“时间中的准确瞬间”转换回分区时间。

为什么?

如果答案是:所以它是人类所熟悉的,因为人类-我将打印这条线的肯定在印度,你可能会有一些问题,如果你与人相关的区域ID '+0530';你最好想使用更人性化的区域ID 'Asia/Kolkata',例如。

好的,现在请用爪哇语!

时间的瞬间最好用java.time.Instant的实例来表示。这没有时区信息;它只是在时间上标记了一个时刻。(在内部,它存储为UTC,但这是实现细节。这些事情是没有时间的)。

一旦您拥有了一个Instant,并且您有了一个TimeZone,您可以这样做:

代码语言:javascript
运行
复制
Instant x = ....; // obtain an instance somehow.
ZoneId zone = ZoneId.of("Asia/Kolkata"); // get a zone somehow.
ZonedDateTime zdt = x.atZone(zone);

您可以打印一个zdt,例如,使用一个java.time.format.DateTimeFormatter实例,它将按照印度人的意愿呈现它。

如果您已经存储了包含文本2020-06-02T12:30:00+0100的字符串,那么您可以很容易地从那里存储到瞬间,然后您可以通过.atZone返回到印度时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62154114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档