我想從任何選定日期獲取接下來 30 天的備用日期的 TimeInMillis 值。我嘗試使用 for 回圈獲取日期的值。但代碼總是將最后 3 個日期回傳為錯誤。有沒有其他更好的方法來獲得我正在做的事情?
fun calculateDates(startDate: Long) {
val singeDateDifference = 86400000
val cancelledDates = arrayListOf<Long>()
for (i in 2..30 step 2) {
val difference = i * singeDateDifference
cancelledDates.add(startDate difference)
}
}
我得到的答案是這個。為了更好地理解,我已將 Long 值記錄為日期。
startDate: 01/01/2022
[02/01/2022, 04/01/2022, 06/01/2022, 08/01/2022, 10/01/2022, 12/01/2022, 14/01/2022, 16/01/2022, 18/01/2022, 20/01/2022, 22/01/2022, 24/01/2022, 07/12/2021, 09/12/2021, 11/12/2021]
我總是得到上個月的最后 3 個日期。我無法弄清楚代碼有什么問題。
uj5u.com熱心網友回復:
在行
val difference = i * singeDateDifference
您使用的是整數型別(Int在 Kotlin 中),因此對于足夠大的乘法結果,您將得到整數溢位(因為Int.MAX_VALUEis 2147483647),這意味著乘法的結果將是負值。這發生在最后 3 個差異值上,這會導致最后 3 個日期晚 1 個月。
只要確保乘法是用 Long 型別完成的,一種簡單的方法是將日期差異因子設定為 Long。
// ensure we use Long when calculating with epoch millis
val singeDateDifference = 86400000L
這將導致對Long值進行乘法運算,結果也將是一個Long值。這將修復錯誤并按預期列印日期。
在一般情況下,時間、日期和日歷并不容易正確,并且已經將多年的作業投入到諸如 Time API 之類的 API 中。在處理時間和日期時,我的建議是改用 Time API 類和方法。它們在包java.time( java.time.*) 中。檔案在這里:https : //developer.android.com/reference/java/time/package-summary
這將防止像您遇到的錯誤,因為它允許您使用更高級別的概念,例如.plusHours(24)或.plusDays(1)(在所有情況下都不相同!)而不是手動進行所有計算。即使您有自己的測驗,您遲早會在時間、日期和日歷方面出現問題。并非所有的日子都是 24 小時,這令人震驚,我知道 :) 這只是我們相信時間的一長串事情中的第一個,這根本不是真的。
如果您必須支持較舊的 Android API 級別(低于 26),您需要至少 v4.0.0 的 Android Gradle 插件才能使用 Time API(支持核心庫脫糖)。
如果由于某種原因無法使用它,請將 JSR-310 Android Backport (ThreeTen ABP) 添加為依賴項。這將在包下添加具有與 Time APIorg.threeten.bp.*相同的類和方法的相同 Time API,否則只能在 API 級別 26 的 Android 上使用(不支持核心庫脫糖)。請注意,推薦的方法是切換到最新版本的 Android Gradle 插件,因為此庫的支持正在逐漸減少。
見這里:https : //github.com/JakeWharton/ThreeTenABP
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391738.html
