考虑以下函数(参数是yyyyMMdd逻辑后面的Int值,因此例如20200131翻译为2020-Jan-31,它是基于本文构建的(
fun dateDiff(first: Int, second: Int): Long {
val intToSDF: (date: Int)-> Date? = { date->
val sdf = SimpleDateFormat("yyyyMMdd", Locale.getDefault())
sdf.parse("$date")
}
val diffInMillies: Long = abs(intToSDF(second)!!.time - intToSDF(first)!!.time )
return TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS)
}
以及以下测试:
@Test
fun testDateDiff(){
assertTrue(dateDiff(20200101, 20200329) == 30L + 29L + 29L)//this is expected
assertTrue(dateDiff(20200101, 20200330) == 30L + 29L + 29L)//this should fail, but it doesn't
}
我不明白为什么第二个断言没有失败。缺少时区处理?舍入问题?如有任何帮助,我们将不胜感激。
编辑
感谢科特林游乐场的@Varun示例(评论中的链接(我发现了一些东西。20200330年,科特林游乐场的时差为7689600000,而当我在当地跑步时,我得到了7686000000——正好是1小时的时差,这可能是由于夏令时的变化(在我所在的地方,是2020年3月29日02:00->03:00(。对此最好的解释是什么?有没有办法将SDF设置为只使用UTC?
将时区设置为GMT解决了问题
fun dateDiff(first: Int, second: Int): Long {
val intToSDF: (date: Int) -> Date? = { date ->
val sdf = SimpleDateFormat("yyyyMMdd z", Locale.getDefault())
sdf.parse("$date GMT")
}
val diffInMillies = abs(intToSDF(second)!!.time - intToSDF(first)!!.time)
return TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS)
}