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



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

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

0GMT的正确偏移量。

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

编辑:我最初并没有注意到你正试图进入欧洲/伦敦。JVM使用的时区数据库看起来基本上是一团糟。您可以尝试修复,也可以简单地使用Joda Time,它自带tzdb副本。样本代码:

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

我自己刚刚遇到过这种情况。

我试过TimeZone.getTimeZone("伦敦");它奏效了。

不,我不知道为什么——"伦敦"不是TimeZone返回的ID之一。。。

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

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

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]

在线演示

输出中的Z是零时区偏移的时区指示符。它代表祖鲁,并指定Etc/UTC时区(时区偏移量为+00:00小时)。

java.util日期-时间API及其格式API、SimpleDateFormat已过时且存在错误。建议完全停止使用它们,并切换到现代日期时间API*。但是,无论出于何种原因,如果您需要将ZonedDateTime的对象转换为java.util.Date的对象,您可以按如下方式进行:

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

跟踪:日期时间了解有关现代日期时间API的更多信息。


*出于任何原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen BackportJava.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API

这让我如愿以偿:

String zone = "Europe/London";
int plusHoursGMT = TimeZone.getTimeZone(zone).getRawOffset() / 3600000;
assertThat(plusHoursGMT, is(0));

相关内容

  • 没有找到相关文章

最新更新