java - ICAL 循环规则生成 (RRULE)

标签 java icalendar ical4j

我需要一些帮助来理解 ICAL 重复规则生成。

我创建了一个日历,其中仅包含一个事件。该事件的规则是在接下来的 5 天内每 2 天重新发生一次。

Google 日历会使用此文件生成 ICS 文件。

...
BEGIN:VTIMEZONE
TZID:America/New_York
X-LIC-LOCATION:America/New_York
BEGIN:DAYLIGHT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
DTSTART:19701101T020000
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE
...

这是让我困惑的部分。

RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
<小时/>

编辑

谷歌生成的完整 ICS 文件。

BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Public
X-WR-TIMEZONE:America/New_York
X-WR-CALDESC:dsdadsa
BEGIN:VTIMEZONE
TZID:America/New_York
X-LIC-LOCATION:America/New_York
BEGIN:DAYLIGHT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
DTSTART:19701101T020000
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;VALUE=DATE:20140415
DTEND;VALUE=DATE:20140416
DTSTAMP:20140319T053224Z
UID:n8gccbdmtb3gdgml543auul5ng@google.com
RECURRENCE-ID;VALUE=DATE:20140415
CLASS:PUBLIC
CREATED:20140319T053209Z
DESCRIPTION:
LAST-MODIFIED:20140319T053209Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:event details
TRANSP:TRANSPARENT
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20140413
DTEND;VALUE=DATE:20140414
DTSTAMP:20140319T053224Z
UID:n8gccbdmtb3gdgml543auul5ng@google.com
RECURRENCE-ID;VALUE=DATE:20140413
CLASS:PUBLIC
CREATED:20140319T053209Z
DESCRIPTION:
LAST-MODIFIED:20140319T053209Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:event details
TRANSP:TRANSPARENT
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20140411
DTEND;VALUE=DATE:20140412
DTSTAMP:20140319T053224Z
UID:n8gccbdmtb3gdgml543auul5ng@google.com
RECURRENCE-ID;VALUE=DATE:20140411
CLASS:PUBLIC
CREATED:20140319T053209Z
DESCRIPTION:
LAST-MODIFIED:20140319T053209Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:event details
TRANSP:TRANSPARENT
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20140409
DTEND;VALUE=DATE:20140410
DTSTAMP:20140319T053224Z
UID:n8gccbdmtb3gdgml543auul5ng@google.com
RECURRENCE-ID;VALUE=DATE:20140409
CLASS:PUBLIC
CREATED:20140319T053209Z
DESCRIPTION:
LAST-MODIFIED:20140319T053209Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:event details
TRANSP:TRANSPARENT
END:VEVENT
BEGIN:VEVENT
DTSTART;VALUE=DATE:20140407
DTEND;VALUE=DATE:20140408
DTSTAMP:20140319T053224Z
UID:n8gccbdmtb3gdgml543auul5ng@google.com
RECURRENCE-ID;VALUE=DATE:20140407
CLASS:PUBLIC
CREATED:20140319T053209Z
DESCRIPTION:
LAST-MODIFIED:20140319T053209Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:event details
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR

而不是给出这个

RRULE:FREQ=DAILY;COUNT=5;INTERVAL=2

Google 分别创建了所有 5 个事件。为什么。??

Activity 从 2014 年 4 月 7 日开始

是否有任何包可以用 Java 执行此操作,节省我很多时间

最佳答案

您显示的信息是时区信息(请注意 BEGIN:VTIMEZONEEND:TIMEZONE),并涵盖该时区夏令时的开始时间。具体来说,夏令时从每年第三个月的第二个星期日开始。

尝试查看 BEGIN:VEVENTEND:VEVENT 之间的代码段,您应该在其中看到事件的 RRULE

RRULE 的生成非常依赖于您的底层数据结构。 Google has a project它提供 RRULE 的解析和评估。

关于java - ICAL 循环规则生成 (RRULE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22497849/

相关文章:

android - android android.database.sqlite.SQLiteException : unrecognized token 中的 SQL 错误

java - 通过java程序将挪威字母插入SQLite数据库

java - 为什么将 1582 年之前的 Java 日期转换为带有 Instant 的 LocalDate 会给出不同的日期?

python - 使用 Python 发送 session 邀请

php - 在 PHP 中获取 Google 日历事件

java - iCal 同步可以在 Java 中使用吗?如何使用java连接ical服务器?

java - 从浏览器中使用 Outlook 打开 .ics 文件

java - 默认情况下登录 Tomcat Web 服务器是异步的吗?

java - 使用正则表达式从字符串中提取文件扩展名

java - 无法将自定义参数添加到 VTODO 组件的 STATUS 属性 (ical4j)