如何在一个应用程序中一致地使用RRULE datetime序列和任意非RRULE datetime序列

如何在一个应用程序中一致地使用RRULE datetime序列和任意非RRULE datetime序列,date,datetime,import,type-conversion,rrule,Date,Datetime,Import,Type Conversion,Rrule,如何从一系列日期生成RRULE(任何RRULE,无论其优化程度如何),或者,如果无法生成RRULE,则以与日期列表轻松兼容的方式使用RRULE定义的日期 换句话说,如何处理现代计算机科学共同确定的任意日期列表是不可能转换为RROLES的,同时支持以下方法 然而,从日期列表中提取RROLES显然是计算机的一项工作,我很难相信这不是大学计算机科学三年级必须做的事情 是的,我见过:“不可能知道生成日期集合的确切规则” 现在,我希望大家都坐下来,因为这会让你大吃一惊,但是存在着一系列重复的日期,这些日期

如何从一系列日期生成RRULE(任何RRULE,无论其优化程度如何),或者,如果无法生成RRULE,则以与日期列表轻松兼容的方式使用RRULE定义的日期

换句话说,如何处理现代计算机科学共同确定的任意日期列表是不可能转换为RROLES的,同时支持以下方法

然而,从日期列表中提取RROLES显然是计算机的一项工作,我很难相信这不是大学计算机科学三年级必须做的事情

是的,我见过:“不可能知道生成日期集合的确切规则”

现在,我希望大家都坐下来,因为这会让你大吃一惊,但是存在着一系列重复的日期,这些日期一开始并不是由一个RRULE生成的

(不仅仅是开玩笑;我自己也很惊讶美国一个重要城市的图书馆系统不会在内部使用RRULE,但要非常具体地说明现实世界对该功能的需求,它不会,我们将以一个例子来结束。)

所以说得很清楚,我不是在寻找一系列日期时间的“最佳”RRULE,这无论如何都是一个判断调用。我正在寻找从重复日期列表自动生成的任何有效RRULE。例如:一个好的开始是检查它是否每天都有,如果没有检查,就会产生人类或机器已知的最丑陋的RRULE,这只是一系列例外

也许这是另一种方法:当人们使用RRULE小部件来提供一系列不遵循良好重复规则的事件时,给出的建议或示例。你会退回到只允许额外的日期吗

无论如何,这里有一个承诺的现实世界的例子,一系列的日期必须定期处理,这些日期不是从一个RRULE本身产生的,但可能会混乱地减少到一个:

    "future_dates": [
        {
            "event_id": 4998685,
            "start": "2019-10-01T10:30:00-04:00"
        },
        {
            "event_id": 4998686,
            "start": "2019-10-08T10:30:00-04:00"
        },
        {
            "event_id": 4998687,
            "start": "2019-10-15T10:30:00-04:00"
        },
        {
            "event_id": 4998688,
            "start": "2019-10-22T10:30:00-04:00"
        },
        {
            "event_id": 4998689,
            "start": "2019-10-29T10:30:00-04:00"
        },
        {
            "event_id": 4998690,
            "start": "2019-11-05T10:30:00-05:00"
        },
        {
            "event_id": 4998691,
            "start": "2019-11-12T10:30:00-05:00"
        },
        {
            "event_id": 4998692,
            "start": "2019-11-19T10:30:00-05:00"
        },
        {
            "event_id": 4998693,
            "start": "2019-11-26T10:30:00-05:00"
        },
        {
            "event_id": 4998694,
            "start": "2019-12-03T10:30:00-05:00"
        },
        {
            "event_id": 4998695,
            "start": "2019-12-10T10:30:00-05:00"
        },
        {
            "event_id": 4998696,
            "start": "2019-12-17T10:30:00-05:00"
        },
        {
            "event_id": 4998698,
            "start": "2019-12-31T10:30:00-05:00"
        },
        {
            "event_id": 4998699,
            "start": "2020-01-07T10:30:00-05:00"
        },
        {
            "event_id": 4998700,
            "start": "2020-01-14T10:30:00-05:00"
        },
        {
            "event_id": 4998701,
            "start": "2020-01-21T10:30:00-05:00"
        },
        {
            "event_id": 4998702,
            "start": "2020-01-28T10:30:00-05:00"
        },
        {
            "event_id": 4998703,
            "start": "2020-02-04T10:30:00-05:00"
        },
        {
            "event_id": 4998704,
            "start": "2020-02-11T10:30:00-05:00"
        },
        {
            "event_id": 4998705,
            "start": "2020-02-18T10:30:00-05:00"
        },
        {
            "event_id": 4998706,
            "start": "2020-02-25T10:30:00-05:00"
        },
        {
            "event_id": 4998707,
            "start": "2020-03-03T10:30:00-05:00"
        },
        {
            "event_id": 4998708,
            "start": "2020-03-10T10:30:00-04:00"
        },
        {
            "event_id": 4998709,
            "start": "2020-03-17T10:30:00-04:00"
        },
        {
            "event_id": 4998710,
            "start": "2020-03-24T10:30:00-04:00"
        },
        {
            "event_id": 4998711,
            "start": "2020-03-31T10:30:00-04:00"
        },
        {
            "event_id": 4998712,
            "start": "2020-04-07T10:30:00-04:00"
        },
        {
            "event_id": 4998713,
            "start": "2020-04-14T10:30:00-04:00"
        },
        {
            "event_id": 4998714,
            "start": "2020-04-21T10:30:00-04:00"
        },
        {
            "event_id": 4998715,
            "start": "2020-04-28T10:30:00-04:00"
        },
        {
            "event_id": 4998716,
            "start": "2020-05-05T10:30:00-04:00"
        },
        {
            "event_id": 4998717,
            "start": "2020-05-12T10:30:00-04:00"
        },
        {
            "event_id": 4998718,
            "start": "2020-05-19T10:30:00-04:00"
        },
        {
            "event_id": 4998719,
            "start": "2020-05-26T10:30:00-04:00"
        },
        {
            "event_id": 4998720,
            "start": "2020-06-02T10:30:00-04:00"
        },
        {
            "event_id": 4998721,
            "start": "2020-06-09T10:30:00-04:00"
        },
        {
            "event_id": 4998722,
            "start": "2020-06-16T10:30:00-04:00"
        },
        {
            "event_id": 4998723,
            "start": "2020-06-23T10:30:00-04:00"
        },
        {
            "event_id": 4998724,
            "start": "2020-06-30T10:30:00-04:00"
        },
        {
            "event_id": 4998725,
            "start": "2020-07-07T10:30:00-04:00"
        },
        {
            "event_id": 4998726,
            "start": "2020-07-14T10:30:00-04:00"
        },
        {
            "event_id": 4998727,
            "start": "2020-07-21T10:30:00-04:00"
        },
        {
            "event_id": 4998728,
            "start": "2020-07-28T10:30:00-04:00"
        },
        {
            "event_id": 4998729,
            "start": "2020-08-04T10:30:00-04:00"
        },
        {
            "event_id": 4998730,
            "start": "2020-08-11T10:30:00-04:00"
        },
        {
            "event_id": 4998731,
            "start": "2020-08-18T10:30:00-04:00"
        },
        {
            "event_id": 4998732,
            "start": "2020-08-25T10:30:00-04:00"
        },
        {
            "event_id": 4998733,
            "start": "2020-09-01T10:30:00-04:00"
        },
        {
            "event_id": 4998734,
            "start": "2020-09-08T10:30:00-04:00"
        },
        {
            "event_id": 4998735,
            "start": "2020-09-15T10:30:00-04:00"
        },
        {
            "event_id": 4998736,
            "start": "2020-09-22T10:30:00-04:00"
        },
        {
            "event_id": 4998737,
            "start": "2020-09-29T10:30:00-04:00"
        },
        {
            "event_id": 4998738,
            "start": "2020-10-06T10:30:00-04:00"
        },
        {
            "event_id": 4998739,
            "start": "2020-10-13T10:30:00-04:00"
        },
        {
            "event_id": 4998740,
            "start": "2020-10-20T10:30:00-04:00"
        },
        {
            "event_id": 4998741,
            "start": "2020-10-27T10:30:00-04:00"
        },
        {
            "event_id": 4998742,
            "start": "2020-11-03T10:30:00-05:00"
        },
        {
            "event_id": 4998743,
            "start": "2020-11-10T10:30:00-05:00"
        },
        {
            "event_id": 4998744,
            "start": "2020-11-17T10:30:00-05:00"
        },
        {
            "event_id": 4998745,
            "start": "2020-11-24T10:30:00-05:00"
        },
        {
            "event_id": 4998746,
            "start": "2020-12-01T10:30:00-05:00"
        },
        {
            "event_id": 4998747,
            "start": "2020-12-08T10:30:00-05:00"
        },
        {
            "event_id": 4998748,
            "start": "2020-12-15T10:30:00-05:00"
        },
        {
            "event_id": 4998749,
            "start": "2020-12-22T10:30:00-05:00"
        },
        {
            "event_id": 4998750,
            "start": "2020-12-29T10:30:00-05:00"
        },
        {
            "event_id": 4998751,
            "start": "2021-01-05T10:30:00-05:00"
        },
        {
            "event_id": 4998752,
            "start": "2021-01-12T10:30:00-05:00"
        }
    ]

如果您有一个完全任意的事件列表,您可能希望使用一组RDATE而不是RRULE。请参见

如果您有一个完全任意的事件列表,您可能希望使用一组RDATE而不是RRULE。请参见

我有一些注意事项,但不是代码,这些注意事项是针对内部未使用RRULE但允许用户创建一系列事件的系统实现RRULE生成的。这是第一次削减,“足够好”与另一个系统通信,但潜在的丑陋

在我开始之前,你打算用你的灵魂做什么是很重要的。如果您的目标是将事件从一个日历系统导出并导入到另一个日历系统中,那么您只需要想出一种适用于目标系统的方法——一组RDATE可能就是其中的一个

另一方面,如果您希望提供iCalendar文件(可能作为电子邮件附件)来处理任意日历客户端,请注意,许多流行客户端并没有完全实现RFC5545。尤其是Apple calendar不支持RDATE(如中所述)。我们针对Google Calendar、Outlook(某些版本)和Apple进行了测试,得出结论,所有人都支持通过EXDATE排除某些日期的RRULE

一般的概念(从我的笔记中)是获取一组事件,并尝试从源系统支持的选项中找到一个适合的模式,从最稀疏到最密集。(例如,从每年的模式开始,每天工作。)如果一个模式覆盖了所有的事件,即使模式中有额外的日期,也要考虑一个模式。然后可以使用EXDATE排除“额外”日期。对于一组难以匹配的日期,这可能会导致一个每日模式的RRULE,并伴随一个大的ExDate列表。(iCalendar支持的频率小到第二个,但出于我们的目的,我怀疑您的目的,每天是预期的最小间隔)

另一件值得了解的事情是:在iCalendar中,您可以将重新安排的事件指定为一个附加事件,该事件具有自己的日期/时间,并将RECURRENCE-ID设置为如果没有重新安排,事件将开始的日期/时间。这是一种很好的方法来处理与日期模式相匹配但已移动到一天中不同时间的事件。因此,考虑在没有时间的情况下,只在事件的日期上建立RRUP,然后在任何时间调整中添加异常。p> 这是假设您的系统在重新调度事件时保持事件与其系列的其余部分之间的关联。如果没有,这将大大简化您的任务——重新调度的事件只会在模式中留下一个漏洞,为此您添加一个EXDATE


祝你好运

我有一些注意事项,但不是代码,它们是为一个内部不使用RRULE但允许用户创建一系列事件的系统实现RRULE生成的。这是第一次削减,“足够好”与另一个系统通信,但潜在的丑陋

在我开始之前,你打算用你的灵魂做什么是很重要的。如果您的目标是将事件从一个日历系统导出并导入到另一个日历系统中,那么您只需要想出一种适用于目标系统的方法——一组RDATE可能就是其中的一个

另一方面,如果您希望提供iCalendar文件(可能作为电子邮件附件)来处理任意日历客户端,请注意,许多流行客户端并没有完全实现RFC5545。尤其是Apple calendar不支持RDATE(如中所述)。我们针对Google Calendar、Outlook(某些版本)和Apple进行了测试,得出结论,所有人都支持通过EXDATE排除某些日期的RRULE

一般的概念(从我的笔记中)是记录一组事件,并试图找到一个模式