10

英国では、UTC/GMTから現在のオフセットを取得したいと思います。現在、オフセットは1時間ですが、これを見つける方法はないようです。

コード

    TimeZone timeZone = TimeZone.getDefault();
    logger.debug("Timezone ID is '" + timeZone.getID() + "'");
    if (timeZone.getID().equals("GMT")) {
        timeZone = TimeZone.getTimeZone("Europe/London");
        logger.debug("New timezone is '" + timeZone.getID() + "'");
    }
    Long eventDateMillis = Long.parseLong(eventDateValue.getKeyValue());
    int timezoneOffset = timeZone.getOffset(eventDateMillis);
    logger.debug("Offset for " + eventDateValue + "(" + eventDateMillis + ") using timezone " + timeZone.getDisplayName() + " is " + timezoneOffset);

デバッグ出力を返します

Wed 2012/09/19 16:38:19.503|Debug|DataManagement|Timezone ID is 'GMT'
Wed 2012/09/19 16:38:19.503|Debug|DataManagement|New timezone is 'GMT'
Wed 2012/09/19 16:38:19.557|Debug|DataManagement|Offset for 18 Sep 2012 09:00(1347958800000) using timezone Greenwich Mean Time is 0

つまり、タイムゾーン'GMT'はゼロのオフセットを返していますが、正しいオフセットを返すように設定する方法が見つかりません。

誰かがJodaTimeの実用的なコードサンプルを提供できれば、それは可能ですが、ワンライナーにするためだけに別のライブラリをインストールする必要はありません。

Javaのバージョンは7です。

4

5 に答える 5

13

つまり、タイムゾーン'GMT'はゼロのオフセットを返していますが、正しいオフセットを返すように設定する方法が見つかりません。

0、永続的にGMTの正しいオフセットです。

GMTとBSTを切り替えるタイムゾーンである「ヨーロッパ/ロンドン」が必要です。

編集:私はあなたがヨーロッパ/ロンドンを取得しようとしていることに最初は気づいていませんでした。JVMが使用しているタイムゾーンデータベースは基本的に混乱しているようです。これを修正するか、tzdbの独自のコピーが付属しているJodaTimeを使用することができます。サンプルコード:

DateTimeZone zone = DateTimeZone.forID("Europe/London");
long offset = zone.getOffset(new Instant());
System.out.println(offset); // 3600000
于 2012-09-19T17:09:51.457 に答える
1

私はこれに自分で遭遇しました。

TimeZone.getTimeZone( "London");を試しました。そしてそれはうまくいった。

いいえ、理由はわかりません-「ロンドン」はTimeZoneが返すIDの1つではありません...

于 2012-10-19T14:17:11.827 に答える
1

timezone.getOffset(eventDateMillis)の代わりにtimezone.getOffset(0)を使用します。

これにより、1970年1月1日のグリニッジ標準時のオフセットが得られます。ヨーロッパ/ロンドンの場合は3600000であり、ウェールズと北アイルランドの歴史的な問題によりゼロではありません。

于 2015-08-05T15:39:33.697 に答える
1

java.time

java.time.ZonedDateTimeタイムゾーンオフセットを自動的に調整するように設計されています。

デモ:

import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        LocalTime time = LocalTime.of(10, 20);
        ZoneId zoneId = ZoneId.of("Europe/London");

        // A winter date-time
        ZonedDateTime zdtWinter = ZonedDateTime.of(LocalDate.of(2020, 11, 22), time, zoneId);
        System.out.println(zdtWinter);

        // A summer date-time
        ZonedDateTime zdtSummer = ZonedDateTime.of(LocalDate.of(2021, 07, 22), time, zoneId);
        System.out.println(zdtSummer);
    }
}

出力:

2020-11-22T10:20Z[Europe/London]
2021-07-22T10:20+01:00[Europe/London]

ONLINE DEMO

Z出力のは、ゼロタイムゾーンオフセットのタイムゾーン指定子です。Zuluの略で、Etc/UTCタイムゾーン(+00:00時間帯のオフセットがあります)を指定します。

java.utilDate-Time APIとそのフォーマットAPIはSimpleDateFormat古く、エラーが発生しやすいです。それらの使用を完全に停止し、最新の日時API *に切り替えることをお勧めします。ただし、何らかの理由で、のオブジェクトをのオブジェクトに変換する必要がある場合ZonedDateTimejava.util.Date、次のように行うことができます。

Date date = Date.from(zdtSummer.toInstant());

Trail: DateTimeから最新のDate-TimeAPIの詳細をご覧ください。


*何らかの理由で、Java6またはJava7に固執する必要がある場合は、 Java.time機能のほとんどをJava6および7にバックポートするThreeTen-Backportを使用できます。AndroidプロジェクトおよびAndroidAPIで作業している場合レベルはまだJava-8に準拠していません。脱糖によって利用可能なJava8+APIAndroidプロジェクトでのThreeTenABPの使用方法を確認してください。

于 2021-07-23T18:51:58.253 に答える
0

これは私をトリックにしました:

String zone = "Europe/London";
int plusHoursGMT = TimeZone.getTimeZone(zone).getRawOffset() / 3600000;
assertThat(plusHoursGMT, is(0));
于 2016-11-21T17:51:02.770 に答える