我有下面的代码,我试图在其中发布带有日期和数量的销售订单交易,一旦我',getting
交易日期当天,滞后了31天,显然12月1日被认为是一年中的第一天!我的代码有什么问题,或者我该如何修复它?!
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.*
data class transaction (var date: LocalDate, var quantity: Double) {
private var calendar: Calendar =
GregorianCalendar(date.year, date.monthValue, date.dayOfMonth)
var day: Int
get() = calendar.get(Calendar.DAY_OF_YEAR)
set(value) = TODO()
}
val formatter: DateTimeFormatter
get() = DateTimeFormatter.ofPattern("dd.MM.yyyy", Locale.ENGLISH)
fun main(args: Array<String>) {
var salesOrders = ArrayList<transaction>()
salesOrders.add(transaction(LocalDate.parse("01.01.2018", formatter), 5.0))
println(salesOrders[0].date.dayOfMonth) // prints: 1
println(salesOrders[0].date.monthValue) // prints: 1
println(salesOrders[0].date.year) // prints: 2018
println(salesOrders[0].day) // prints 32 ??!!
}
最佳答案
我建议您完全放弃使用 Calendar
和 GregorianCalendar
。
println(salesOrders[0].date.dayOfYear) // prints 1
我还没有Kotlin,所以没有测试过。如果有无法解决的拼写错误,请在评论中跟进。
Calendar
和 GregorianCalendar
早已过时,LocalDate
所属的现代 Java 日期和时间 API 更好用。并提供您可能想要的所有功能。
我从您的评论中了解到,多年来您的每一天都需要一个唯一的标识符。您一直在使用calendar.timeInMillis
。首先,这是一个很差的标识符,因为它随时区的不同而变化。相反,我建议使用 LocalDate
本身或其从 date.toString
获取的字符串表示形式。如果您需要数字标识符(例如 calendar.timeInMillis
),则可以使用 date.toEpochDay
。这是自 1970 年 1 月 1 日纪元以来的天数计数,因此每天都是唯一的(并且不受时区影响)。
关于java - GregorianCalendar 给出错误的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49212986/