在英国,我想获得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。
答案 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.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
是零时区偏移的 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 desugaring 和 How to use ThreeTenABP in Android Project。
答案 3 :(得分:0)
使用timezone.getOffset(0),而不是timezone.getOffset(eventDateMillis)。
这将为您提供格林威治标准时间1970年1月1日的偏移量,在欧洲/伦敦的情况下为3600000,由于威尔士和北爱尔兰的历史问题而不为零。
答案 4 :(得分:0)
这让我成了诀窍:
sqlite-uwp-