【问题标题】:Calculating next date for events计算事件的下一个日期
【发布时间】:2019-12-04 09:41:02
【问题描述】:

我正在尝试构建一个包含重复事件的应用程序。 在我的数据库中,我有一个表 recurring_pattern:

type_name  sepereation_count  day_of_week  week_of_month  day_of_month  month_of_year
daily      0                  NULL         NULL           NULL          NULL
weekly     0                  2            NULL           NULL          NULL
monthly    0                  1            3              NULL          NULL
monthly2   1                  NULL         NULL           10            NULL
yearly     0                  NULL         NULL           20            5

seperation_count:如果需要每隔一周/每月/等配置一次事件,则 seperation_count 将为 1
day_of_week: 1 = 星期一; 2 = 星期二等。

我有一个表 recurring_events:

id  start_date  last_occurence  recurring_pattern_name
1   2019-10-01  2019-12-03      daily
2   2019-10-01  2019-12-03      weekly
3   2019-10-01  2019-11-18      monthly
4   2019-11-01  NULL            monthly2
5   2019-01-01  2019-05-20      yearly

接下来的活动日期应该是:
1 = 2019-12-04 因为每一天
2 = 2019-12-10,因为每周星期二(每周从星期一开始)
3 = 2019-12-16,因为每 3 周的星期一
4 = 2019-12-10,因为每隔一个月的 10 日。
5 = 2020-05-20,因为每年的第 5 个月和第 20 天

现在我正在尝试在 Java 中查找下一个日期,但我不知道该怎么做。
对于我的日常活动

nextDate = lastPaid == null ? startDate : lastPaid;
nextDate = nextDate.plusDays(1 + recurringPattern.getSepereationCount());

但是我如何获得每周、每月、每月 2 和每年活动的下一个日期?

I used this as a template

【问题讨论】:

    标签: java date events date-manipulation


    【解决方案1】:

    对于每周计划

        int separationCount = 0;
        LocalDate start = LocalDate.parse("2019-10-01");
        int dowNumber = 2;
    
        DayOfWeek dow = DayOfWeek.of(dowNumber);
    
        LocalDate first = start.with(TemporalAdjusters.nextOrSame(dow));
        System.out.println("first: " + first);
        LocalDate next = first.plusWeeks(1 + separationCount);
        System.out.println("next: " + next);
    

    这个演示 sn-p 的输出是:

    first: 2019-10-01
    next: 2019-10-08
    

    每月计划

        LocalDate start = LocalDate.parse("2019-10-01");
        int dowNumber = 1;
        int weekOfMonth = 3;
    
        DayOfWeek dow = DayOfWeek.of(dowNumber);
    
        LocalDate first = start.with(WeekFields.ISO.weekOfMonth(), weekOfMonth)
                .with(dow);
        if (first.isBefore(start)) {
            // Use next month instead
            first = start.plusMonths(1)
                    .with(WeekFields.ISO.weekOfMonth(), weekOfMonth)
                    .with(dow);
        }
    
        System.out.println("first: " + first);
    
    first: 2019-10-14
    

    您可以用类似的方式计算以下日期。

    Monthly2 计划

    这个很简单。使用LocalDate.withDayOfMonth()LocalDate.plusMonths()。请记住以与上述相同的方式检查您计算的第一个日期是否早于开始日期。请记住,第 29、30 或 31 天并不适用于每个月。

    年度计划

    我把这个留给你。在LocalDate的文档中找到您需要的内容。

    文档链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多