2013-04-12 4 views
9

다음 코드 세그먼트로 Joda Time의 표준 시간대 ID를 간단히 표시 할 수 있습니다.Joda Time/Java 8에서 시간대 오프셋, 시간대 ID 및 긴 이름을 나열하는 방법은 무엇입니까?

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

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

그러나 해당 시간대 오프셋, 시간대 ID 및 긴 이름을 표시하여 목록이 다음과 같이 표시 될 수있는 방법은 무엇입니까?

(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 

선택을 위해 드롭 다운 상자에 나열해야합니다.


다음 스 니펫은 이름을 표시하지만 표시되는 오프셋은 워키합니다. 이 표시 긴 목록 중

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

는, 그들 중 몇은, 같은 표시

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

this 목록에 표시되어야한다 상쇄된다.

답변

16

다음 접근 방식이 적용되었습니다.

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

내가 지금 알지 못하는 다른 방법이나 아마도 더 좋은 방법이있을 수 있습니다.


아니면 (예 Etc/GMT+0) 그리니치 시간

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

, 그것은 예 +00:00 대신 제 마찬가지로 GMT+00:00을 표시하기위한 표시한다. mm : HH - 이름 로케일을 사용할 수없는 경우

,이 방법 (public final String getName(long instant))의 포맷 [+]에 문자열을 반환한다. 다음

은 협정 세계시 예를 UTC 들면

public String getName(long instant, Locale locale) 

짧은 이름은 오버 방법을 사용하여 필요한 경우 Locale도 사용될 수 적절한 표시 할 수있다. 적절한 Locale 함께

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

오버로드 된 방법을 사용하여 필요한 경우

public String getShortName(long instant, Locale locale) 

업데이트 : 사용이

Java Time API 자바 SE 8되는이 더욱 단순화 인 .

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

표시 이름은 java.time.format.TextStyle에서 사용할 수있는 다양한 스타일이있다. 예를 들어, 약어는 TextStyle.SHORT을 사용하여 표시 할 수 있습니다.

zone.getDisplayName(TextStyle.FULL, Locale.ENGLISH)은 "인도 시간"과 같은 긴 이름을 표시합니다. 그러나 이것은 Joda Time과는 다른 완전한 이름은 아닙니다.

다음은 "인도 표준시"(해당되는 경우)와 같은 지정된 이름의 전체 이름을 표시합니다.

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

다음은 표시 영역 오프셋 GMT+05:30 같은 지정된 영역 (패턴의 대소 주)의.

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

다음은 약어를 표시하기위한 것입니다. 위한

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

수도 ZZZ, +0000+0530처럼 영역이 오프셋.

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