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.monthValue1..12 范围内,而 Calendar.JANUARY0 范围内,因此 Calendar 月份在 0..11

范围内

所以下面的代码应该可以工作:

private var calendar: Calendar = 
            GregorianCalendar(date.year, date.monthValue - 1, date.dayOfMonth)

我建议您完全放弃使用 CalendarGregorianCalendar

    println(salesOrders[0].date.dayOfYear)  // prints 1

我没有Kotlin,所以没有测试。如果有您无法解决的错字,请在评论中跟进。

CalendarGregorianCalendar 早已过时,LocalDate 所属的现代 Java 日期和时间 API 工作起来更好用和。并提供您想要的所有功能。

我从您的评论中了解到,多年来您每天都需要一个唯一标识符。您一直在使用 calendar.timeInMillis。首先,这是一个糟糕的标识符,因为它随时区而变化。相反,我建议使用 LocalDate 本身或其从 date.toString 获得的字符串表示形式。如果你需要一个数字标识符(就像你从 calendar.timeInMillis 得到的一样),你可以使用 date.toEpochDay。这是自 1970 年 1 月 1 日以来的天数,因此每一天都是唯一的(并且不受时区影响)。