gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:25:39 24 4
gpt4 key购买 nike

考虑以下因素:

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

最佳答案

为什么需要本地时区?

  • 如果用户在其他地方设置了时区,为什么要忽略他们的偏好?如果用户覆盖了自动时区功能,那是因为他们希望看到在特定时区呈现的时刻。
  • 如果记录当前时刻,一般来说,您应该记录 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
}

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

您提出问题的事实让我怀疑您不完全理解日期时间处理的某些方面。日期时间处理是一件很棘手的事情。因此,如果您认为我没有理解您的观点,请澄清您的问题或发表评论。

关于java - 不使用时区 API 从用户当前地理位置获取时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53982668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com