如何在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降级"提供了大部分功能。