如何在安卓中获取时区偏移量>



如何在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;dr

ZoneId
.systemDefault()
.getRules()
.getOffset(
Instant.now()
)

详细信息

切勿使用TimeZone。该类是与最早版本的Java捆绑在一起的遗留日期-时间类之一。几年前由JSR310中定义的现代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及更高版本中。对于早期的安卓系统,现代工具通过"API降级"提供了大部分功能。

最新更新