【问题标题】:How to add dates to calender in the right way如何以正确的方式将日期添加到日历
【发布时间】:2020-09-01 01:19:37
【问题描述】:

我有一个包含日期的 ArrayList - [1, 5, 2020] // day|month|year

我以这种方式将其添加到日历中:

calendar.add(Calendar.DAY_OF_MONTH, dateList[0])
calendar.add(Calendar.MONTH, dateList[1])
calendar.add(Calendar.YEAR, dateList[2])

但是当我尝试将其分配给我的日期选择器时,我得到了这个日期:

datePicker.maxDate = calendar
date picker Log: 16/10/4040

我的代码可能有什么问题?

【问题讨论】:

  • Kotlin + 过时且麻烦的日期时间 API = 没有好主意...为此使用 java.time

标签: android datetime kotlin calendar java.util.calendar


【解决方案1】:

现代答案。自 2014 年起在 Java 中有效,我认为它在几年后才出现在 Android 中。

java.time 和 ThreeTenABP

我是 Java,因为这是我能写的。

    ArrayList<Integer> dateList = new ArrayList<>(Arrays.asList(1, 5, 2020));

    LocalDate date = LocalDate
            .of(dateList.get(2), dateList.get(1), dateList.get(0));

    System.out.println("Date: " + date);

输出是:

日期:2020-05-01

LocalDate(相反的Calendar)正确地计算月份,所以 5 是五月。如果您打算使用六月,请不要使用文字 5,这将非常混乱。如果六月不能使用 6,请使用内置常量 Calendar.JUNE。并且记得在传递给LocalDate.of()时加1。

由于您需要将日期作为日期选择器的Calendar 对象,因此我们需要进行转换。 Calendar 对象包括一天中的时间和时区等等,所以确实是大材小用,但我们当然需要遵守日期选择器 API。习惯上在 JVM 的时区中使用一天的开始时间。

    ZonedDateTime startOfDay = date.atStartOfDay(ZoneId.systemDefault());
    Calendar oldfashionedCalendar = DateTimeUtils.toGregorianCalendar(startOfDay);

    System.out.println(oldfashionedCalendar.getTime());

2020 年 5 月 1 日星期五 00:00:00 CEST

问题:java.time 不需要 Android API 26 级吗?

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。只有在这种情况下,不要使用DateTimeUtils进行转换,使用稍微简单一点的GregorianCalendar.from(startOfDay)
  • 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    【解决方案2】:

    那是因为您添加这些值(到实例化的初始日期)。相反,您应该使用 set

    calendar.set(Calendar.DAY_OF_MONTH, dateList[0])
    calendar.set(Calendar.MONTH, dateList[1])
    calendar.set(Calendar.YEAR, dateList[2])
    

    【讨论】:

      【解决方案3】:

      calender.add 函数使用您当前的日期进行添加 calender.set 它将设置日期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-10
        • 2017-09-25
        • 1970-01-01
        • 2017-10-02
        • 2014-11-28
        • 2010-10-08
        相关资源
        最近更新 更多