首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按当前时间在此区域中查找ZoneId

按当前时间在此区域中查找ZoneId
EN

Stack Overflow用户
提问于 2021-10-22 11:54:04
回答 2查看 532关注 0票数 0

在这个ZoneId到UTC时间的预期时间内找到ZoneId的最佳方法是什么?

例如,

目前在世界协调时的时间:

2021-10-22T11:40:37.808Z

需要找到任何ZoneId,ZoneId中的当前时间应该是:

17

17-11 =6

因此,我们正在寻找任何ZoneId,它有:

UTC+06:00

例如,它是:

亚洲/喀什(UTC+06:00)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-22 12:01:55

您可以获得所有的ZoneId和相应的偏移量。

代码语言:javascript
复制
import java.time.*;
import java.util.*;

class Main {  
  public static void main(String args[]) { 
    System.out.println(zoneIdToOffsetMap()); 
  }

private static Map<String, String> zoneIdToOffsetMap() {
        Map<String, String> result = new HashMap<>();

        LocalDateTime localDateTime = LocalDateTime.now();

        for (String zoneId : ZoneId.getAvailableZoneIds()) {
            ZoneId id = ZoneId.of(zoneId);
            // LocalDateTime -> ZonedDateTime
            ZonedDateTime zonedDateTime = localDateTime.atZone(id);
            // ZonedDateTime -> ZoneOffset
            ZoneOffset zoneOffset = zonedDateTime.getOffset();
            //replace Z to +00:00
            String offset = zoneOffset.getId().replaceAll("Z", "+00:00");

            result.put(id.toString(), offset);
        }

        return result;
    }
}

这张地图如下所示:

代码语言:javascript
复制
{Asia/Aden=+03:00, America/Cuiaba=-04:00, ...}

如果您真的想要一个给定偏移量的所有ZoneId,您可以稍微修改上面的代码,以返回一个String -> List<String>映射,或者返回单个偏移量的一个List<String>,如下所示。

代码语言:javascript
复制
private static List<String> getZoneIds(String target) {
        List<String> zoneIds = new ArrayList<>();

        LocalDateTime localDateTime = LocalDateTime.now();

        for (String zoneId : ZoneId.getAvailableZoneIds()) {
            ZoneId id = ZoneId.of(zoneId);
            // LocalDateTime -> ZonedDateTime
            ZonedDateTime zonedDateTime = localDateTime.atZone(id);
            // ZonedDateTime -> ZoneOffset
            ZoneOffset zoneOffset = zonedDateTime.getOffset();
            //replace Z to +00:00
            String offset = zoneOffset.getId().replaceAll("Z", "+00:00");

            if (offset.equals(target)) {
                zoneIds.add(id.toString());
            }
        }

        return zoneIds;
    }
}

这些指纹:

代码语言:javascript
复制
[Asia/Kashgar, Etc/GMT-6, Asia/Almaty, Asia/Dacca, Asia/Omsk, Asia/Dhaka, Indian/Chagos, Asia/Qostanay, Asia/Bishkek, Antarctica/Vostok, Asia/Urumqi, Asia/Thimbu, Asia/Thimphu]
票数 4
EN

Stack Overflow用户

发布于 2021-10-22 16:32:20

你说过:

因此,我们正在寻找任何ZoneId,其中有: UTC+06:00

时区使用的偏移量随时间而变化.这就是时区的定义:过去、现在和未来的历史--对某一特定地区的人民根据其政治家的决定所使用的抵消所作的改变。

因此,我们必须指定一个时刻,一个Instant,我们想知道它的当前偏移量。

在下面的代码中,我们使用一个流来考虑每个时区。对于每个时区,我们获取它的一组规则,即更改历史以抵消。在我们选择的时刻,我们会查询这些规则的偏移量。对于返回的偏移量,我们比较它是否是我们想要的偏移量。

代码语言:javascript
复制
Instant instant = Instant.now() ;
ZoneOffset targetOffset = ZoneOffset.ofHours( 6 ) ;
List< ZoneId > zonesUsingDesiredOffset = 
    ZoneId
    .getAvailableZoneIds()  // Returns a `Set` of `String` objects, the names of each known time zone.
    .stream()
    .map( zoneName -> ZoneId.of( zoneName ) )  // Map each zone name to `ZoneId` object.
    .filter(
        zoneId -> zoneId.getRules().getOffset( instant ).equals( targetOffset )  // Filter for zones whose offset at specified moment matches our desired offset.
    )
    .collect( Collectors.toList() )
;

看这个在IdeOne.com现场运行的代码

亚洲/喀什,Etc/GMT-6,亚洲/阿拉木图,亚洲/达卡,亚洲/Omsk,亚洲/达卡,印度/查戈斯,亚洲/齐齐尔达,亚洲/比什凯克,南极洲/东方,亚洲/乌鲁木齐,亚洲/廷布,亚洲/廷布

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

https://stackoverflow.com/questions/69676453

复制
相关文章

相似问题

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