我有一个包含一些数据的数据库,其中每个数据都有一个以毫秒为单位的时间戳。
我需要从数据库获取本周的数据。我有周图表,需要显示本周的数据。
我尝试用谷歌搜索,但没有找到任何适合我的用例的东西。
我将根据一些数据来说明答案。
你所说的毫秒——它必须与某个 0 点或 Epoc 相关。假设这是“Unix epoc”,您可以 (1) 使用
java.time.Instant
将毫秒转换为 Epoc,然后您可以转换为许多日期/时间类之一,例如您需要为其选择时区的 ZoneDateTime (2) (3)
然后你需要计算出本周开始的时间适合你。你说星期一,但那天是午夜?以及在哪个时区。再次假设
UTC
时区,在(5)我们从“现在”“砍掉”小时/分钟等以获得当天的午夜,然后在(6)我们回到上一个星期一。
现在我在(7)处我们可以过滤以将数据集限制为“本周的数据”:
fun main(args: Array<String>) {
// https://www.epochconverter.com/
val data = listOf(
Data(1711916054000L, "Apples"), // Sunday, 31 March 2024 20:14:14 GMT
Data(1712002454000L, "Orange"), // Monday, 1 April 2024 20:14:14 GMT
Data(1712175254000L, "Pears"), // Tuesday, 2 April 2024 20:14:14 GMT
)
println("Raw data")
data.forEach {
it.datetime = ZonedDateTime.ofInstant( // (2)
Instant.ofEpochMilli(it.millis), // (1)
ZoneOffset.UTC) // (3)
println(it)
}
println()
val startOfThisWeek = ZonedDateTime.now(ZoneOffset.UTC) // (4)
.truncatedTo(ChronoUnit.DAYS) // (5)
.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)) // (6)
println("Data for this week, where this week starts on $startOfThisWeek")
data.filter { startOfThisWeek <= it.datetime } // (7)
.forEach { println(it) }
}
data class Data(val millis:Long, val thing: String, var datetime: ZonedDateTime? = null)
输出是
Raw data
Data(millis=1711916054000, thing=Apples, datetime=2024-03-31T20:14:14Z)
Data(millis=1712002454000, thing=Orange, datetime=2024-04-01T20:14:14Z)
Data(millis=1712175254000, thing=Pears, datetime=2024-04-03T20:14:14Z)
Data for this week, where this week starts on 2024-04-01T00:00Z
Data(millis=1712002454000, thing=Orange, datetime=2024-04-01T20:14:14Z)
Data(millis=1712175254000, thing=Pears, datetime=2024-04-03T20:14:14Z)