代码之家  ›  专栏  ›  技术社区  ›  Red M

不使用时区API从用户当前地理位置获取时区

  •  0
  • Red M  · 技术社区  · 7 年前

    请考虑以下几点:

    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 Services location API而不是任何其他API根据用户地理位置获取当前时区?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Basil Bourque    7 年前

    你为什么需要当地时区?

    • 如果用户的时区设置在其他地方,为什么忽略他们的首选项?如果用户已覆盖自动时区功能,则是因为他们希望看到特定时区中显示的时刻。

    而且,您使用的是可怕的麻烦日期时间类,多年前被 java.time公司

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

    Instant instant = Instant.now() ;
    

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

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

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

    两个变量 instant 和 zdt

    要输入未来的约会或事件,请收集日期、时间和区域。把它们组装成 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
    }
    

    因此,您可以看到用户的物理位置应该与您对日期时间值和时间波瓣的处理无关。

    推荐文章