2016-07-27 27 views
1

Gibt es eine Option in JodaTime, wo, sobald eine gültige ISO-Zeichenfolge mit Zeitzonen-Offset analysiert wird, ich die Zeitzone zurückbekommen kann?Zeitzone vom Zeitzonen-Offset abrufen?

String dateTime = "2012-11-29T23:08:56.23-04:00" 

wo -04:00 die Zeitzone Offset

Sobald diese analysiert wird, gibt es eine eingebaute in Joda API, die mir die Zeitzone für die oben analysierten Zeichenfolge geben kann? Eg. America/Dominica

Oder ist dies auch ein gültiges Problem, auf der here

+0

Noch wichtiger ist, eine bestimmte Zeitzone kann mehr als einen Offset haben, abhängig vom Tag (aufgrund von Tageslichteinsparungen) - was bedeutet, dass das Ergebnis Ihrer Konvertierung vom Datum selbst abhängt, was nicht intuitiv und fehleranfällig erscheint ... – assylias

+0

@assylias: Also, sagen Sie Umwandlung von einem o ffset zu einer Zeitzone kann fehleranfällig sein? – striker

+0

Ich sage das, zum Beispiel können Sie sagen, dass '+00: 00' am 1. Januar in' Europe/London' konvertiert. Aber "Europe/London" ist am 1. Juli "+01: 00". Sie sollten erklären, was Sie versuchen zu erreichen, da dies im Moment wie ein [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) klingt. – assylias

Antwort

1

Sie können nicht eine einzige Zeitzone erhalten Diskussion basierte zu beginnen, da es sein kann (und sind in der Regel) mehrere Zeitzonen mit, dass zu einem bestimmten Offset Zeitpunkt. Aber Sie können eine Liste von ihnen bekommen:

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; 
} 

druckt

[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] 

Watch out für die "synthetische" Zeitzonen wie Etc/GMT + 4