Java 从时区偏移获取时区?

Java 从时区偏移获取时区?,java,datetime,timezone,jodatime,Java,Datetime,Timezone,Jodatime,JodaTime中是否有一个选项,一旦使用时区偏移量解析ISO有效字符串,我就可以返回时区 String dateTime = "2012-11-29T23:08:56.23-04:00" 其中-04:00是时区偏移 解析完后,是否有任何内置的JodaAPI可以为我提供上述解析字符串的时区? 例如,美国/多米尼加 或者这是一个有效的问题,根据讨论,你不能得到一个时区,因为在给定的时间点上可能有(通常是)多个时区具有该偏移量。但你可以得到它们的列表: public void printZones

JodaTime中是否有一个选项,一旦使用时区偏移量解析ISO有效字符串,我就可以返回时区

String dateTime = "2012-11-29T23:08:56.23-04:00"
其中
-04:00
是时区偏移

解析完后,是否有任何内置的JodaAPI可以为我提供上述解析字符串的时区? 例如,美国/多米尼加


或者这是一个有效的问题,根据讨论,你不能得到一个时区,因为在给定的时间点上可能有(通常是)多个时区具有该偏移量。但你可以得到它们的列表:

public void printZonesByOffset() {
    DateTime dateTime = DateTime.parse("2012-11-29T23:08:56.23-04:00");
    Set<DateTimeZone> matchingTimeZones = getTimeZonesByOffset(dateTime);
    System.out.println(matchingTimeZones);
}

public Set<DateTimeZone> getTimeZonesByOffset(DateTime dateTime) {
    int dateTimeOffset = dateTime.getZone().getOffset(dateTime);

    Set<String> timeZoneIds = DateTimeZone.getAvailableIDs();
    Set<DateTimeZone> matchingTimeZones = new HashSet<>();
    for (String timeZoneId : timeZoneIds) {
        DateTimeZone timeZone = DateTimeZone.forID(timeZoneId);
        int offset = timeZone.getOffset(dateTime);
        if (dateTimeOffset == offset) {
            matchingTimeZones.add(timeZone);
        }
    }
    return matchingTimeZones;
}

注意“合成”时区,如Etc/GMT+4

更重要的是,给定时区可能有多个偏移,具体取决于日期(由于夏令时),这意味着转换的结果将取决于日期本身,这似乎是违反直觉和容易出错的…@assylias:那么你是说从偏移量转换到时区可能容易出错?我是说,例如,你可能会说在1月1日将
+00:00
转换到
欧洲/伦敦
。但是7月1日是欧洲/伦敦
+01:00
。您应该解释一下您试图实现的目标,因为这听起来像是一个问题。@assylias:我只是想看看给定的带时区偏移量的iso有效日期时间字符串,我是否能够从时区偏移量中检索时区。因为帖子上说**“给定一个时区和一个日期时间,你可以确定正确的偏移量。但是仅仅给定一个偏移量,你无法确定正确的时区。”**是的,我把它变成了一个XY问题,我将重新表述这个问题。谢谢,不知道我也掉进洞里了
[America/Blanc-Sablon, America/Puerto_Rico, America/Goose_Bay, America/Guyana, America/Moncton, America/Porto_Velho, America/Halifax, America/Anguilla, America/Kralendijk, America/Curacao, America/Thule, America/Grenada, America/Martinique, America/Guadeloupe, Atlantic/Bermuda, Etc/GMT+4, America/Manaus, America/Antigua, America/Eirunepe, America/Tortola, America/Rio_Branco, America/Boa_Vista, America/St_Thomas, America/Port_of_Spain, America/Aruba, America/St_Vincent, America/Montserrat, America/Marigot, America/Santo_Domingo, America/La_Paz, America/St_Kitts, America/Barbados, America/Glace_Bay, America/Lower_Princes, America/St_Lucia, America/Dominica, America/St_Barthelemy]