Kotlin-自定义日期差异,奇怪的测试行为



考虑以下函数(参数是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)
}

最新更新