java - GregorianCalendar 给出错误的天数

标签 java date kotlin java.util.calendar

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

最佳答案

我建议您完全放弃使用 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 日纪元以来的天数计数,因此每天都是唯一的(并且不受时区影响)。

关于java - GregorianCalendar 给出错误的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49212986/

相关文章:

java - 服务中的线程 - Android 应用程序

java - 使用 WebdriverManager 在多个测试线程中注册驱动程序时出错

android - 在按钮单击 android 中获取下周值的问题

php - 将日期转换为与之前在 Codeigniter 中相同的格式

java - 在 Material Chipgroup (Android) 中检查 Animate Chip

java - 如何在不使用 hasNextInt() Java 的情况下从文本文件读取整数

java - 页面对象应该返回页面对象吗?

python - 在 pandas 中使用 mm-dd-YY 到 YY-mm-dd 格式处理日期

android - Recyclerview View 未填充

android - 如何格式化 kotlinx-datetime LocalDateTime?