在不使用时区API的情况下从用户的当前地理位置获取时区

时间:2018-12-31 00:53:05

标签: java android google-location-services

请考虑以下内容:

LocationCallback mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            List<Location> locationList = locationResult.getLocations();
            if (locationList.size() > 0) {
                //The last location in the list is the newest
                Location location = locationList.get(locationList.size() - 1);
            }
        }
    };

如果我尝试使用以下方法获取当前时区:

long time = location.getTime();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(time));
TimeZone timeZone = calendar.getTimeZone();

返回的时区是与我当前的运行设备相关的时区,而不是与我的当前位置相关的时区。由于当前的逻辑,用户可以通过设备设置->日期和时间->禁用自动时区来手动更改其当前时区。

是否可以使用Google Play服务位置API而不是任何其他API根据用户地理位置获取当前时区?

1 个答案:

答案 0 :(得分:1)

您为什么需要本地时区?

  • 如果用户在其他地方设置了时区,为什么忽略他们的偏好?如果用户已覆盖自动时区功能,那是因为他们想查看特定时区中显示的时刻。
  • 一般来说,如果要记录当前时刻,则应该以UTC记录当前值,而不考虑任何时区。

此外,您还使用了可怕的麻烦的日期时间类,这些类早在几年前就被 java.time 类所取代。

要捕获当前时刻,请使用UTC。

Instant instant = Instant.now() ;

要向用户展示,请使用JVM当前的默认时区。

ZoneId z = ZoneId.systemDefault() ;
ZonedDateTime zdt = instant.atZone( z ) ;

如果至关重要,请与用户确认。或者至少在用户界面中显示您正在使用的时区。

两个变量instantzdt代表相同的同时时刻,时间轴上的相同点,但具有不同的挂钟时间。

要输入将来的约会或事件,请收集日期,一天中的时间和区域。将它们组装成ZonedDateTime对象。

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 13 , 30  ) ;
ZoneId z = ZoneId.systemDefault() ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;

要与当前时刻进行比较,请获取Instant,并调整为UTC。

Instant instant = zdt.toInstant() ;

获取当前时刻。

Instant now = Instant.now() ;

比较。

if( instant.isBefore( now ) ) {
    … reject their input
}

因此,您可以看到用户的实际位置与您处理日期时间值和时空无关。

您提出问题的事实使我怀疑您对日期时间处理的某些方面尚不完全了解。日期时间处理是绝招。因此,如果您认为我有遗漏,请澄清您的问题或发表评论。