2013-04-12 13 views
9

ジョーダ時間のタイムゾーン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); 
} 

私が現在気付いていない他の、おそらくより良い方法があるかもしれません。


または

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

(例えばEtc/GMT+0)グリニッジ標準時の場合、それは代わりに、最初の場合と同様に、GMT+00:00表示例+00:00ため、表示します。

名ロケールのために利用可能でない場合、このメソッド(public final String getName(long instant))は 形式[+ - ]の文字列を返しHH:MMを。

必要に応じて適切なLocaleにも次のように協定世界時のための一例のUTCのため

public String getName(long instant, 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のSE 8にJava Time APIを使用

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ゾーンオフセット+0530+0000等のため。

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

関連する問題