2013-04-12 9 views
9

Identyfikatory strefy czasowej z czasem Jody mogą być wyświetlane z następującym segmentem kodu.Jak wyświetlić przesunięcie strefy czasowej, identyfikator strefy czasowej i długą nazwę w Joda Czas/Java 8?

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 

for(String zoneId:zoneIds) { 
    System.out.println(zoneId); 
} 

Ale jak wyświetlić odpowiednią strefę czasową offset, identyfikator strefy czasowej oraz długą nazwę tak, że lista mogłaby wyglądać jak poniżej?

(GMT-10:00) Pacific/Honolulu, Hawaii Standard Time 
(GMT-10:00) Pacific/Johnston, Hawaii Standard Time 
(GMT-10:00) Pacific/Fakaofo, Tokelau Time 
(GMT-10:00) HST, Hawaii Standard Time 

Są one potrzebne do wylistowania w rozwijanym oknie wyboru.


Poniższy fragment pokazuje nazwy, ale przesunięcie, które wyświetla wygląda niewyraźnie.

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 

for (String zoneId : zoneIds) { 
    int offset = DateTimeZone.forID(zoneId).getOffset(new DateTime()); 
    String longName = TimeZone.getTimeZone(zoneId).getDisplayName(); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

Spośród długiej listy to wyświetla, niektóre z nich są pokazane jak,

(-36000000) Pacific/Honolulu, Hawaii Standard Time 
(-36000000) Pacific/Johnston, Hawaii Standard Time 
(-36000000) Pacific/Fakaofo, Tokelau Time 
(-36000000) HST, Hawaii Standard Time 

Przesunięcie powinno być jak pokazano na this listy.

Odpowiedz

16

Następujące podejście zadziałało.

import java.util.Set; 
import java.util.TimeZone; 
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ"); 

for (String zoneId : zoneIds) { 
    String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0); 
    String longName = TimeZone.getTimeZone(zoneId).getDisplayName(); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

Mogą istnieć inne i prawdopodobnie lepsze sposoby, o których teraz nie wiem.


Albo

import java.util.Set; 
import org.joda.time.DateTimeUtils; 
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ"); 

for (String zoneId : zoneIds) { 
    String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0); 
    String longName = DateTimeZone.forID(zoneId).getName(DateTimeUtils.currentTimeMillis()); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

Greenwich Mean Time (Etc/GMT+0, na przykład), to wyświetla na przykład +00:00 zamiast wyświetlania GMT+00:00 jak w pierwszym przypadku.

Jeżeli nazwa nie jest dostępna dla lokalizacji, to metoda ta (public final String getName(long instant)) zwraca ciąg w formacie - [+] HH: MM.

Odpowiedni Locale można również stosować, w razie potrzeby przy użyciu przeciążone metody

public String getName(long instant, Locale locale) 

krótkich nazw, na przykład UTC dla Coordinated Universal Time mogą być wyświetlane w następujący sposób.

import java.util.Set; 
import org.joda.time.DateTimeUtils; 
import org.joda.time.DateTimeZone; 
import org.joda.time.format.DateTimeFormat; 
import org.joda.time.format.DateTimeFormatter; 

Set<String> zoneIds = DateTimeZone.getAvailableIDs(); 
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("ZZ"); 

for (String zoneId : zoneIds) { 
    String offset = dateTimeFormatter.withZone(DateTimeZone.forID(zoneId)).print(0); 
    String shortName = DateTimeZone.forID(zoneId).getShortName(DateTimeUtils.currentTimeMillis()); 

    System.out.println("(" + offset + ") " + zoneId + ", " + shortName); 
} 

Przy odpowiednim Locale, w razie potrzeby stosując metodę przeciążenia

public String getShortName(long instant, Locale locale) 

Update:

Użycie Java Time API Java SE 8, w którym jest dalej uproszczony .

import java.time.ZoneId; 
import java.time.ZoneOffset; 
import java.time.ZonedDateTime; 
import java.time.format.TextStyle; 
import java.util.Locale; 
import java.util.Set; 

Set<String> zoneIds = ZoneId.getAvailableZoneIds(); 

for (String zoneId : zoneIds) { 
    ZoneId zone = ZoneId.of(zoneId); 
    ZonedDateTime zonedDateTime = ZonedDateTime.now(zone); 

    ZoneOffset offset = zonedDateTime.getOffset(); 
    String longName = zone.getDisplayName(TextStyle.FULL, Locale.ENGLISH); 

    System.out.println("(" + offset + ") " + zoneId + ", " + longName); 
} 

Nazwa wyświetlana ma różne style dostępne w java.time.format.TextStyle. Na przykład skróty mogą być wyświetlane za pomocą TextStyle.SHORT.

wyświetli długie nazwy, takie jak "India Time". To jednak nie jest pełne imię, w przeciwieństwie do czasu Jody.

Poniżej zostanie wyświetlona pełna nazwa tego imienia, np. "Indyjski czas standardowy" (jeśli dotyczy).

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("zzzz"); 
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId))); 

Poniższa wyświetli strefa-przesunięcie danej strefie jak GMT+05:30 (Uwaga kapitalizacji wzorca).

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("ZZZZ"); 
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId))); 

Poniżej przedstawiono do wyświetlania skrótów.

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("zzz"); 
String longName = pattern.format(ZonedDateTime.now(ZoneId.of(zoneId))); 

Capital ZZZ dla strefy offsetu jak +0530, +0000.

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

Powiązane problemy