0

我有下面的代码,我试图发布销售订单交易,日期和数量,一旦我,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 ??!!
}
4

2 回答 2

4

我建议你完全放弃使用CalendarGregorianCalendar

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

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

Calendar并且GregorianCalendar已经过时了,并且其LocalDate所属的现代 Java 日期和时间 API 使用起来要好得多。并提供您想要的所有功能。

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

于 2018-03-10T21:18:55.887 回答
0

LocalDate.monthValue在范围内,1..12因此月份在范围内Calendar.JANUARY0Calendar0..11

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

private var calendar: Calendar = 
            GregorianCalendar(date.year, date.monthValue - 1, date.dayOfMonth)
于 2018-03-10T19:27:09.100 回答