【问题标题】:Android calendar get previous to previous month of previous yearAndroid日历获取前一年的上个月
【发布时间】:2020-04-29 10:14:10
【问题描述】:

我遇到了 android 日历的问题,我想提前到上个月,当我在今年尝试它时,这将实现我的目标,但是当我尝试上一年时它失败了。就我而言,今天是 2020 年 4 月 29 日,我希望 2019 年 2 月从日历返回。请帮我解决这个问题。

我的代码如下

Date dt = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(dt);
int month = cal.get(Calendar.MONTH) - 2; // beware of month indexing from zero
            int year = cal.get(Calendar.YEAR)-1;
            int day = cal.get(Calendar.DAY_OF_MONTH);
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.MONTH, month);
            String formatMonth = new SimpleDateFormat("MMM").format(cal.getTime());
            String formatYear = new SimpleDateFormat("yy").format(cal.getTime());```  

【问题讨论】:

  • 输出是什么?

标签: java android calendar


【解决方案1】:

java.time 和 ThreeTenABP

请允许我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。

    YearMonth currentMonth = YearMonth.of(2020, Month.APRIL);
    YearMonth backThen = currentMonth.minusYears(1).minusMonths(2);

    String formatMonth = backThen.format(DateTimeFormatter.ofPattern("MMM"));
    String formatYear = backThen.format(DateTimeFormatter.ofPattern("yy"));

    System.out.printf("Month %s; year %s%n", formatMonth, formatYear);

我的计算机上的输出是(取决于区域设置):

二月; 19 年

为了一个可重现的例子,我硬编码了年份和月份。要从某个时区的当前月份开始,请使用以下内容:

    YearMonth currentMonth = YearMonth.now(ZoneId.of("Europe/Minsk"));

你的代码出了什么问题?

CalendarGregorianCalendar 类的设计糟糕且令人困惑。

您说您在 2020 年 4 月 29 日运行了代码。这会导致您的 Calendar 设置回 2019 年 2 月 29 日。此日期不存在;去年2月只有28天。而是Calendar 选择了 2 月 28 日之后的一天,即 3 月 1 日。导致您得到错误的月份。

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

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

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    相关资源
    最近更新 更多