如何在Java中获得英国夏季偏移量(BST)

时间:2012-09-19 16:51:46

标签: java timezone

在英国,我想获得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。

5 个答案:

答案 0 :(得分:11)

  

换句话说,时区'GMT'返回零偏移量,我找不到如何将其设置为返回正确偏移量的东西。

0 是GMT的正确偏移量。

你想要“欧洲/伦敦”,这是在GMT和BST之间切换的时区。

编辑:我原本没有注意到你尝试来获得欧洲/伦敦。看起来你的JVM正在使用的时区数据库基本搞砸了。您可以尝试修复那个,或者只使用自带的tzdb副本的Joda Time。示例代码:

DateTimeZone zone = DateTimeZone.forID("Europe/London");
long offset = zone.getOffset(new Instant());
System.out.println(offset); // 3600000

答案 1 :(得分:1)

我自己刚刚遇到过这个问题。

我试过TimeZone.getTimeZone(“伦敦”);它起作用了。

不,我不知道为什么 - '伦敦'不是TimeZone返回的ID之一......

答案 2 :(得分: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 是零时区偏移的 timezone designator。它代表祖鲁语并指定 Etc/UTC 时区(时区偏移为 +00:00 小时)。

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*。但是,无论出于何种原因,如果您需要将 ZonedDateTime 的对象转换为 java.util.Date 的对象,您可以这样做:

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

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

答案 3 :(得分:0)

使用timezone.getOffset(0),而不是timezone.getOffset(eventDateMillis)。

这将为您提供格林威治标准时间1970年1月1日的偏移量,在欧洲/伦敦的情况下为3600000,由于威尔士和北爱尔兰的历史问题而不为零。

答案 4 :(得分:0)

这让我成了诀窍:

sqlite-uwp-