如何以正确的方式将日期添加到日历

How to add dates to calender in the right way

我有一个包含日期的 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

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

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

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

calender.add function makes addition with your current date use calender.set it will set date.

现代答案。自 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);

输出为:

Date: 2020-05-01

LocalDate(与 Calendar 相对)数字月份很正常,所以 5 是五月。如果你打算 June,不要使用字面上的 5,那会很混乱。如果您不能将 6 用于 June,请使用内置常量 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());

Fri May 01 00:00:00 CEST 2020

问题: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,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接