我有一个web应用程序,它根据事件发生的国家返回预订时间。
如果预订是在India at 02-JUNE-2020 1700 IST
创建的,那么返回的时间是:
2020-06-02T17:00:00+0530
如果预订是在泰国在02-JUNE-2020 1700
泰国时间创建的,那么返回的时间是:
2020-06-02T17:00:00+0700
现在,我必须将所有这些存储在英国时间的一个系统中,因此数据如下:
India,in UK system:2020-06-02T12:30:00+0100
泰国,英国系统:2020-06-02T11:00:00+0100
我知道我可以使用区域指示符+0530转换为毫秒偏移,通过使用
TimeZone.getAvailableIDs(milliseconds);
并找到相应的时区进行反向集成。
但是,有什么简单的方法可以直接用java把IST翻译成英国时间呢?
发布于 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,您可以这样做:
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
返回到印度时间。
https://stackoverflow.com/questions/62154114
复制相似问题