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。