0

我想遍历一年中的几个月并打印出来。

例如:

01/2012 02/2012 03/2012 04/2012 等等...

这是我的代码:

 Calendar myDate = Calendar.getInstance();

 for (int i = 0; i < totalMonths; i++) {
        TableRow row = new TableRow(this);
        myDate.add(Calendar.MONTH, i);
        FinalDate = df.format(myDate.getTime());
        TextView tvNum = new TextView(this);
        tvNum.setText("      " + FinalDate);
        row.addView(tvNum);
        table.addView(row);
    }
}

它在 int 中打印出来

1 2 3 4 5

但是,当我将其转换为日期字符串时,如上面的代码所示,它会这样做:

05/2012 06/2012 08/2012 11/2012 03/2013 08/2013

基本上,月的间隔是 1,然后是 2,然后是 3,然后是 4 等等......我的计算是否错误?(显示 1,2,3,4 等 int 列表正在做它应该做的事情)还是有更好的方法来打印几个月?

我只是想让它走

今天的日期 + 1 个月 今天的日期 + 2 个月等...这个 m

4

4 回答 4

2

i每次都将月份添加到当前日期。

因此,第三次迭代将2月份添加到前一个日期,第四次添加3,依此类推。

您应该1每次只添加一个月。

于 2012-05-24T02:38:53.847 回答
1

你在哪里定义 myDate?在循环之外,我假设?如果是这样,那么您第一次添加 0+0,第二次添加 (0+0)+1,第三次添加 (0+0+1)+2,依此类推。

要解决此问题,您必须在循环内定义 myDate。

于 2012-05-24T02:39:12.473 回答
1

代替 :

myDate.add(Calendar.MONTH, i);

myDate.add(Calendar.MONTH, 1);

否则每次都创建一个新日期。目前您正在操作您的实际 myDate 对象。

于 2012-05-24T02:39:19.333 回答
-1

java.time 通过脱糖

我想贡献现代的答案,现代的方式来获得你的结果。我建议这些天您使用现代 Java 日期和时间 API java.time 来进行日期工作。其他人已经很好地解释了为什么您的代码给出了意外的输出,我不再重复了。

    int noOfMonths = 13;
    YearMonth current = YearMonth.now(ZoneId.of("Africa/Tunis"));
    for (int i = 0; i < noOfMonths; i++) {
        System.out.println(current);
        current = current.plusMonths(1);
    }

当我今天运行这个片段时,输出是:

2019-01
2019-02
2019-03
2019-04
2019-05
2019-06
2019-07
2019-08
2019-09
2019-10
2019-11
2019-12
2020-01

如果您想要月份名称,请使用格式化程序:

    DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM u", Locale.ENGLISH);
    int noOfMonths = 13;
    YearMonth current = YearMonth.now(ZoneId.of("Africa/Tunis"));
    for (int i = 0; i < noOfMonths; i++) {
        System.out.println(current.format(monthFormatter));
        current = current.plusMonths(1);
    }

输出:

January 2019
February 2019
March 2019
April 2019
May 2019
June 2019
July 2019
August 2019
September 2019
October 2019
November 2019
December 2019
January 2020

当这个问题在将近 7 年前被问到时,Calendar是我们为这样的任务准备的课程,也是当它设计不佳且使用起来很麻烦的时候。不再是:java.time 在几年后推出了 Java 8,并且也被向后移植到了 Java 6 和 7。

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

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

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

链接

于 2019-01-16T12:15:32.633 回答