问题描述
如何在 android - java 中获取时区偏移量? 出现本地日期时间错误。
public static String getoffsetTimeZone() {
TimeZone timeZone = TimeZone.getDefault();
Timber.e(": %s",timeZone.getoffset(Calendar.ZONE_OFFSET));
Timber.e(" timeZone.getID(): %s",timeZone.getID());
String myTimeZone = ZoneId.systemDefault().getId();
LocalDateTime dt = LocalDateTime.Now();
LocalDate dt0 = LocalDate.Now(); // Added 1.8
ZoneId zone = ZoneId.of(myTimeZone);
zoneddatetime zdt = dt.atZone(zone);
ZoneOffset offset = zdt.getoffset();
int secondsOfHour = offset.getTotalSeconds() % (60 * 60);
String out = String.format("%35s %10s%n"," zone= "+ zone," offset= "+ offset);
Timber.e("out= " + out);
return "UTC";
}
解决方法
您可以简单地使用以下内容来获取它。这将为您提供当前的偏移量。
Integer offset = ZonedDateTime.now().getOffset().getTotalSeconds();
,
tl;博士
ZoneId
.systemDefault()
.getRules()
.getOffset(
Instant.now()
)
详情
切勿使用 TimeZone
。该类是与最早版本的 Java 捆绑在一起的遗留日期时间类之一。多年前由 JSR 310 中定义的现代 java.time 类补充。
永远不要调用 LocalDateTime.now()
。该类不能代表片刻,因为它故意缺少任何时区概念或与 UTC 的偏移量。我无法想象调用该方法是正确做法的场景。
获取 JVM 当前的默认时区。
ZoneId zone = ZoneId.systemDefault() ;
获取该区域的规则,该特定区域的人们使用的偏移量的过去、现在和未来变化的历史。
ZoneRules rules = zone.getRules() ;
捕捉当前时刻。
Instant instant = Instant.now() ;
获取该区域当时有效的偏移量,产生 ZoneOffset
。
ZoneOffset offset = rules.getOffset( instant ) ;
java.time 类出现在 Android 26 及更高版本中。对于早期的 Android,现代工具通过“API 脱糖”提供大部分功能。