【问题标题】:Getting time zone from current geo location of user without using Time Zone API在不使用 Time Zone API 的情况下从用户的当前地理位置获取时区
【发布时间】:2018-12-31 00:53:05
【问题描述】:

考虑以下几点:

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 根据用户地理位置获取当前时区?

【问题讨论】:

    标签: java android google-location-services


    【解决方案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
    }
    

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

    您提出问题的事实使我怀疑您不完全理解日期时间处理的某些方面。日期时间处理是诡计。因此,如果您认为我错过了您的观点,请澄清您的问题或发表评论。

    【讨论】:

    • 业务逻辑如下:用户通过在日历中创建事件与应用交互的次数越多,他们获得的积分奖励就越多。考虑到这一点,我们决定使用来自服务器而不是来自设备的当前时间,否则他们将有可能在过去创建事件并因此获得奖励,这是我们不想要的。由于实现了时间逻辑,我决定尝试使用地图中位置的时区而不是设备中的时区,因为它可以手动更改。如果您需要我进一步解释,请告诉我。
    • @RedM 同样,没有必要忽略他们对时区的偏好。如果问题在当前时刻之前及时返回,您可以随时检查。取用户提交的任何日期、时间和区域,生成ZonedDateTime,调用toInstant,如我的答案所示,与您服务器上的Instant.now() 进行比较。无需关心他们的地理位置。 .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2012-01-06
    • 2011-10-05
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多