【问题标题】:Loop through Joda Time months at month end在月底循环遍历 Joda Time 月份
【发布时间】:2020-11-07 11:28:45
【问题描述】:

我已经使用 Joda Time 创建了一个循环来遍历月份并根据指定的每月频率返回日期。问题是,如果今天的日期是月底,则循环不会返回我的预期结果。如果我从 2020 年 7 月 31 日开始,经过多次迭代后,我希望返回 2021 年 7 月 31 日,而不是返回 2020 年 7 月 30 日(因为上个月只有 30 天)。

我的代码:

int frequency = 3;

for(LocalDate date = startDate; date.isBefore(endDate); date=date.plusMonths(frequency)  {
int date = Integer.parseInt(date.plusMonths(frequency).toString("yyyyMMdd"));
}

我的预期结果应该是: 2020 年 7 月 31 日 2020 年 10 月 31 日 2021 年 1 月 31 日 2021 年 4 月 30 日 2021 年 7 月 31 日。但此代码返回 2020 年 7 月 30 日

我也试过这段代码,但没有成功:

Integer.parseInt(date.dayOfMonth().withMaximumValue().plusMonths(frequency).toString("yyyyMMdd"));

如何正确遍历月末?

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    我必须创建一个最小的、可运行的示例,所以我做了一些假设。

    这是我的测试结果。

    20200731
    20201031
    20210131
    20210430
    20210731
    20211031
    20220131
    20220430
    

    这是我用来产生这些结果的代码。

    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.time.temporal.ChronoUnit;
    
    public class MonthEnd {
    
        public static void main(String[] args) {
            int frequency = 3;
            LocalDate startDate = LocalDate.now();
            LocalDate endDate = startDate.plus(2, ChronoUnit.YEARS);
    
            for (LocalDate date = startDate; date.isBefore(endDate);
                    date = date.plusMonths(frequency)) {
                LocalDate tdate = date.withDayOfMonth(date.lengthOfMonth());
                String dateString = tdate.format(
                        DateTimeFormatter.ofPattern("yyyyMMdd"));
                int dateInt = Integer.parseInt(dateString);
                System.out.println(dateInt);
            }
        }
    
    }
    

    【讨论】:

    • 这些也是我得到的前四个值,但问题出在第五个值上,我得到的不是 20210731,而是 20210730。
    • @groogie13:查看我的更新答案。你可以复制我的代码并自己运行这个测试。
    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 2011-03-02
    • 2011-01-10
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多