android - 检测与android中手机默认时区不同的时区的日期变化
问题描述
所以我知道如何创建一个监听器来监听电话日期的变化。但我需要的是不同的。假设手机的默认时区是“欧洲/巴黎”。我想检测我选择的时区的日期变化(例如“America/Los_Angeles”),因此完全忽略了手机的时区。我到处搜索,但找不到任何东西。有没有简单的方法在android中做到这一点?
解决方案
让我们从获取当天开始的时间戳(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 在下面的评论中提到的那样,它将为您提供正确处理夏季时间的好处。
推荐阅读
- javascript - 为什么 npm 不启动?
- javascript - 访问json对象时Javascipt打印未定义
- python - 故障图像有哪些我可以检测到的特征?
- python-sphinx - 是否可以在我的文档中包含外部 rst 文件?
- python - 使用字典在数据框的文本列中搜索关键字
- mysql - 行计数超过一千并且文件大小确认
- javascript - discord.js 异步函数捕获未触发
- javascript - 如何在屏幕javascript上获取数字输入
- python - 为什么我的蜘蛛提取的物品数量有限
- javascript - 带有变体的shopify购买按钮js产品集