GregorianCalendar 给出错误的日期
GregorianCalendar gives wrong day number
我有下面的代码,我正在尝试 post 销售订单交易,日期和数量,一旦我',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 ??!!
}
LocalDate.monthValue
在 1..12
范围内,而 Calendar.JANUARY
在 0
范围内,因此 Calendar
月份在 0..11
范围内
所以下面的代码应该可以工作:
private var calendar: Calendar =
GregorianCalendar(date.year, date.monthValue - 1, date.dayOfMonth)
我建议您完全放弃使用 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 日以来的天数,因此每一天都是唯一的(并且不受时区影响)。
我有下面的代码,我正在尝试 post 销售订单交易,日期和数量,一旦我',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 ??!!
}
LocalDate.monthValue
在 1..12
范围内,而 Calendar.JANUARY
在 0
范围内,因此 Calendar
月份在 0..11
所以下面的代码应该可以工作:
private var calendar: Calendar =
GregorianCalendar(date.year, date.monthValue - 1, date.dayOfMonth)
我建议您完全放弃使用 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 日以来的天数,因此每一天都是唯一的(并且不受时区影响)。