首页 > 解决方案 > 检测与android中手机默认时区不同的时区的日期变化

问题描述

所以我知道如何创建一个监听器来监听电话日期的变化。但我需要的是不同的。假设手机的默认时区是“欧洲/巴黎”。我想检测我选择的时区的日期变化(例如“America/Los_Angeles”),因此完全忽略了手机的时区。我到处搜索,但找不到任何东西。有没有简单的方法在android中做到这一点?

标签: androidandroid-studiodatetimezonelistener

解决方案


让我们从获取当天开始的时间戳(00:00)开始。我们将此时间戳保存到now变量中。请注意,这个时间戳是 UTC+0,所以我们想根据我们的时区给这个时间戳添加一些偏移量。对于“欧洲/巴黎”,此偏移量为 1 小时 (UTC+1),可以计算为1 * millisInHour. 这意味着巴黎的新一天从 23:00 UTC+0 开始。因此,巴黎时区的当天从 开始,now.time - offset第二天将从 开始now.time - offset + millisInDay。总结一下:

val millisInHour = TimeUnit.HOURS.toMillis(1)
val millisInDay = TimeUnit.DAYS.toMillis(1)
val now = Date(System.currentTimeMillis() / millisInDay * millisInDay)
val offset = 1 * millisInHour
Timer("TimerThread").schedule(
    object : TimerTask() {
        override fun run() {
            Log.i("Timer", "New day in Paris!")
        }
    },
    Date(now.time - offset + millisInDay),
    millisInDay
)

您还可以根据设备的设置简单地获取设备的时区偏移量:

val offset = TimeZone.getDefault().rawOffset

UPD

java.time正如@Ole VV 在他的回答中所说,如果您的 minSdk 为 26 或更高(否则为ThreeTenABP ) ,也可以使用库。Date(now.time - offset + millisInDay)然后,您可以使用以下代码代替手动创建日期( )

val zone = ZoneId.of("Europe/Paris")
val today: LocalDate = LocalDate.now(zone)
val startOfDayTomorrow: Instant = today.plusDays(1).atStartOfDay(zone).toInstant()
val date = Date.from(startOfDayTomorrow)

正如@Ole VV 在下面的评论中提到的那样,它将为您提供正确处理夏季时间的好处。


推荐阅读