13

Joda Time のタイム ゾーン 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

オフセットは、このリストに示されているとおりである必要があります。

4

2 に答える 2

24

次のアプローチが機能しました。

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、たとえば表示されます。+00:00GMT+00:00

ロケールで名前を使用できない場合、このメソッド ( public final String getName(long instant)) は [+-]hh:mm 形式の文字列を返します。

Localeオーバーロードされたメソッドを使用して、必要に応じて適切なものを使用することもできます。

public String getName(long instant, Locale locale)

協定世界時の UTC などの短い名前は、次のように表示できます。

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

Localeオーバーロードされたメソッドを使用して、必要に応じて適切な を使用して、

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

于 2013-04-12T16:14:47.657 に答える
0
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.time.zone.ZoneRules;
import java.util.Locale;
import java.util.TimeZone;

// Europe/Berlin
// Europe/London
// Asia/Kolkata
public class TimeZoneTest {

    public static void main(String[] args) {

        ZonedDateTime timeZone = ZonedDateTime.of(LocalDateTime.of(2020, 8, 06, 05, 45),
                                                   ZoneId.of("Asia/Manila"));

        Instant instant = timeZone.toInstant();
        ZoneRules rules = timeZone.getZone().getRules();
        boolean isDst = rules.isDaylightSavings(instant);
        String dstShortName = DateTimeFormatter.ofPattern("zzz").format(timeZone);
        String dstLongName = DateTimeFormatter.ofPattern("zzzz").format(timeZone);
        TimeZone tz = TimeZone.getTimeZone(timeZone.getZone());

        System.out.println(timeZone.getZone().getId());
        System.out.println(timeZone.getOffset().getTotalSeconds()); //Offset
        System.out.println(rules.getStandardOffset(instant).getTotalSeconds()); //RawOffset
        System.out.println((rules.getDaylightSavings(instant).getSeconds())); //DstSavings
        System.out.println(rules.isDaylightSavings(instant));
        System.out.println(dstShortName);
        System.out.println(dstLongName);
        if (isDst) {
            //Set standard timezone name
            System.out.println(timeZone.getZone().getDisplayName(TextStyle.SHORT, Locale.ENGLISH));
            System.out.println(timeZone.getZone().getDisplayName(TextStyle.FULL, Locale.ENGLISH));
        } else {
            //Set DST timezone name
            System.out.println(tz.getDisplayName(true, TimeZone.SHORT, Locale.ENGLISH));
            System.out.println(tz.getDisplayName(true, TimeZone.LONG, Locale.ENGLISH));
        }

//        //SHORT: CEST
//        DateTimeFormatter.ofPattern("zzz").format(zonedDateTime)
//
//        //SHORT: CET 
//        ZoneId.getDisplayName(TextStyle.SHORT,Locale.ENGLISH)
//
//        //LONG: Central European Summer Time
//        DateTimeFormatter.ofPattern("zzzz").format(zonedDateTime)
//
//        //LONG: Central European Time
//        ZoneId.getDisplayName(TextStyle.LONG,Locale.ENGLISH)
//
//        //Use this for converting CET to CEST and vice versa
//        TimeZone tz = TimeZone.getTimeZone(timeZone.getZone());
//        tz.getDisplayName(true, TimeZone.SHORT, Locale.ENGLISH));


//Joda
//        DateTimeZone dz = DateTimeZone.forID("Asia/Manila");
//        String shortName = dz.getShortName(DateTimeUtils.currentTimeMillis());
//        System.out.println(shortName);
//
//        String longerName = dz.getName(DateTimeUtils.currentTimeMillis());
//        System.out.println(longerName);
    }
}
于 2020-10-07T05:49:14.113 に答える