RRuleKit 是一个 Swift 库,用于解析和格式化 RFC 5545 规范中定义的重复规则。该软件包的设计目标是高性能和低内存占用,它利用 Swift 强大的类型系统和 UnsafeBufferPointer
进行优化解析。
该库提供对 RFC 5545 iCalendar 规范定义的重复规则的全面支持。
FREQ
:指定重复的频率(例如,DAILY
、WEEKLY
、MONTHLY
、YEARLY
等)。MINUTELY
、HOURLY
、DAILY
、WEEKLY
、MONTHLY
、YEARLY
。COUNT
:指定重复发生的次数。
UNTIL
:定义重复结束的日期,可以是 UTC 时间或本地时间。 包括对以下内容的支持:
UNTIL=20250118T102600Z
。UNTIL=TZID=America/New_York:20250118T102200
。UNTIL=20250118
。INTERVAL
:指定事件之间的间隔。 如果未明确定义,则默认为 1
。
BYSECOND
:定义重复规则中一分钟内的特定秒数(例如,BYSECOND=0,15,30
)。
BYMINUTE
:定义重复规则中一小时内的特定分钟数(例如,BYMINUTE=0,15,30
)。
BYHOUR
:定义重复规则中一天内的特定小时数(例如,BYHOUR=8,12,16
)。
BYDAY
:定义重复规则中一周的特定日期。
示例值
BYDAY=MO,TU
:每周一和周二。BYDAY=1SU
:每月的第一个星期日。BYDAY=-1FR
:每月的最后一个星期五。BYMONTHDAY
:指定月份中的特定日期(例如,BYMONTHDAY=1,15,31
)。
BYYEARDAY
:指定年份中的特定日期(例如,BYYEARDAY=1,100,365
)。
BYWEEKNO
:指定年份中的特定周数(例如,BYWEEKNO=1,10,52
)。
BYMONTH
:指定年份中的特定月份(例如,BYMONTH=1,6,12
)。
BYSETPOS
:根据重复实例集合中的位置过滤实例。
示例值
BYSETPOS=1
:第一个实例。BYSETPOS=-1
:最后一个实例。健壮的解析和格式化:
COUNT
和 UNTIL
不一起使用。Calendar.RecurrenceRule
对象和符合 RFC 5545 的字符串之间进行转换。RRuleKit
兼容以下平台
RRuleKit
基于 Foundation.Calendar.RecurrenceRule
,它是 Swift Foundation 的一部分,通过 swift-foundation PR #464 引入。 由于此依赖关系,RRuleKit
仅支持 Calendar.RecurrenceRule
可用的平台。
您可以使用 RecurrenceRuleRFC5545FormatStyle
将符合 RFC 5545 的重复规则字符串解析为 Calendar.RecurrenceRule
实例。
import Foundation
import RRuleKit
// Initialize the parser with the desired calendar (optional)
let parser = RecurrenceRuleRFC5545FormatStyle(calendar: .current)
do {
let rfcString = "FREQ=MONTHLY;BYDAY=MO,TU;BYMONTH=1,6;COUNT=5"
let recurrenceRule = try parser.parse(rfcString)
print("Frequency: \(recurrenceRule.frequency)")
print("End: \(recurrenceRule.end)")
print("Months: \(recurrenceRule.months)")
print("Weekdays: \(recurrenceRule.weekdays)")
} catch {
print("Failed to parse the recurrence rule: \(error)")
}
使用相同的 RecurrenceRuleRFC5545FormatStyle
将 Calendar.RecurrenceRule
对象格式化回符合 RFC 5545 的字符串。
let formatter = RecurrenceRuleRFC5545FormatStyle(calendar: .current)
let rrule = Calendar.RecurrenceRule(
calendar: .current,
frequency: .daily,
interval: 2,
end: .afterOccurrences(5),
weekdays: [.every(.monday), .every(.wednesday)]
)
let result = formatter.format(rrule)
print(result) // Outputs: "FREQ=DAILY;INTERVAL=2;COUNT=5;BYDAY=MO,WE"
该库包含对 Calendar.RecurrenceRule.End
中的 .afterOccurrences
和 .afterDate
格式的支持。 但是,这些格式仅在以下平台版本上可用
FREQ 是强制性的,并且必须是规则字符串中的第一个键。
目前,不支持 FREQ=SECONDLY。
只能指定 COUNT 或 UNTIL 中的一个。
键和值用 = 分隔,并且必须用 ; 分隔。
根据键验证值范围
BYSECOND
0-60BYMINUTE
0-59BYHOUR
0-23BYMONTH
1-12BYDAY
指定带有可选序数修饰符的工作日(例如,-1MO,2TU)BYMONTHDAY
-31 到 31BYYEARDAY
-366 到 366BYWEEKNO
-53 到 53BYSETPOS
-366 到 366该库对每个键强制执行严格的验证,确保值落在 RFC 5545 标准指定的有效范围内。
例如
BYSECOND
值必须在 0–60 范围内。BYMONTHDAY
值必须在 -31–31 范围内。UNTIL
和 COUNT
不能在同一规则中共存。不支持 FREQ=SECONDLY
,因为 Calendar.RecurrenceRule.Frequency
目前不包含此频率。 如果输入字符串指定 FREQ=SECONDLY
,则该库将抛出错误。
RRuleKit
包含一个广泛的测试套件,用于验证以下内容
将以下依赖项添加到您的 Package.swift 文件
dependencies: [
.package(url: "https://github.com/kubens/RRuleKit", from: "1.0.0")
]
然后,将 RRuleKit 添加到目标的依赖项中
.target(
name: "YourTarget",
dependencies: ["RRuleKit"]
)
RRuleKit
在 MIT 许可证下发布。 有关更多详细信息,请参见 LICENSE 文件。
RFC 5545:互联网日历和调度核心对象规范(iCalendar)
完整的规范可以在 RFC 5545 中找到。
Swift Foundation Calendar.RecurrenceRule
RecurrenceRule
是 Swift Foundation 的一部分,并提供了一种 Swift 原生的方式来定义重复规则。 Apple Developer Documentation - Calendar.RecurrenceRule 有关详细信息,请参见 Swift Foundation pull request #464。