【问题标题】:Creating an RRULE for the Nth WEEKDAY before or after a different WEEKDAY在不同的 WEEKDAY 之前或之后为第 N 个 WEEKDAY 创建 RRULE
【发布时间】:2020-08-15 17:26:41
【问题描述】:

我感兴趣地看到以下 RRULE:

每四年,11 月的一个星期一之后的第一个星期二,发生 3 次(美国总统选举日):

>>> list(rrule(YEARLY, interval=4, count=3, bymonth=11,
 ...            byweekday=TU, bymonthday=(2,3,4,5,6,7,8),
 ...            dtstart=parse("19961105T090000")))
 [datetime.datetime(1996, 11, 5, 9, 0),
  datetime.datetime(2000, 11, 7, 9, 0),
  datetime.datetime(2004, 11, 2, 9, 0)]

我想知道的是,如何使用 RRULE 在另一个 WEEKDAY 之前或之后为第 N 个 WEEKDAY 创建通用算法。 (更喜欢python,但伪代码很好。)

【问题讨论】:

  • 您了解美国总统选举日 RRULE 的运作方式吗?您应该能够轻松适应任何第 N 个工作日。
  • 不,我真的不明白它是如何工作的,因此我的问题。

标签: rrule


【解决方案1】:

让我们先了解一下美国总统选举日规则是如何运作的。

11 月的一个星期一之后的第一个星期二

从显而易见的开始:BYWEEYKDAY=TU 将事件限制在星期二,BYMONTH=11 限制在 11 月。

但是,这将在 11 月的所有星期二返回。

如何创建“第一个星期二之后星期一”?

11 月 1 日只能是 7 个工作日之一。如果 11 月 1 日是星期一,那么第一个星期二就是第二个星期二。如果 11 月 1 日是星期日,那么 11 月 2 日是星期一,那么第一个星期二是 3 日。依此类推,直到最后一个可能的选项:如果 11 月 1 日是星期二,那么 11 月 7 日是星期一,如果是 11 月的星期一之后的第一个星期二,那么 11 月 7 日是 8 日。

因此,11 月星期一之后的第一个星期二只能是第 2、第 3、第 4、第 5、第 6、第 7 或第 8 天。这就是BYMONTHDAY=2,3,4,5,6,7,8 正在做的事情。

如何在不同的 WEEKDAY 之前或之后为第 N 个 WEEKDAY 创建通用算法

您只需要概括这个逻辑。一个月只能从 7 个工作日中的一个开始,所以每次你真的只有 7 个解决方案。我将尝试描述一般方法,但您可能需要一些试验和错误来修正确切的公式。

让我们选择星期一之后的第一个星期三。 Wednesday - Monday = 2。星期一可以是第 1 号到第 7 号。所以星期一之后的第一个星期三可以是 1+2=3 到 7+2=9。 BYWEEYKDAY=WE + BYMONTHDAY=3,4,5,6,7,8,9

星期一之后的第二个星期三将是 1+2+7=10th 到 7+2+7=16th。 BYWEEYKDAY=WE + BYMONTHDAY=10,11,12,13,14,15,16.

等等。

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多