ISO8601DurationFormatter

一个用于将 ISO 8601 时长 转换为 DateComponents 的格式化器。

安装

Swift Package Manager

将以下内容添加到你的 Package.swift 文件的依赖

.package(url: "https://github.com/kkla320/ISO8601DurationFormatter.git", from: "2.0.0")

然后在需要的地方导入

import ISO8601DurationFormatter

示例

使用 ISO8601DurationFormatter

将字符串转换为 DateComponents

let input = "PT40M"
let dateComponents = try formatter.dateComponents(from: input)
print(dateComponents.minute) // 40

将 DateComponents 转换为字符串

let dateComponents = DateComponents(year: 6,
                                    month: 2,
                                    day: 2,
                                    hour: 4,
                                    minute: 44,
                                    second: 22,
                                    weekOfYear: 2)
let iso8601DurationString = formatter.string(from: input)
print(iso8601DurationString) // P6Y2M2W2DT4H44M22S

使用扩展方法

将字符串转换为 DateComponents

let dateComponents = try DateComponents(iso8601DurationString: "PT40M")
print(dateComponents.minute) // 40

你也可以使用由 ISO 8601-2:2019 定义的负时长。

let dateComponents = try DateComponents(iso8601DurationString: "-PT40M")
print(dateComponents.minute) // -40

请注意,这是在标准的扩展中定义的。其他库可能无法处理负值。

将 DateComponents 转换为字符串

let dateComponents = DateComponents(year: 6,
                                    month: 2,
                                    day: 2,
                                    hour: 4,
                                    minute: 44,
                                    second: 22,
                                    weekOfYear: 2)

let ISO8601DurationString = dateComponents.toISO8601Duration()
print(ISO8601DurationString) // P6Y2M2W2DT4H44M22S

你也可以使用 emitZeroOrNilValues 参数来配置 toISO8601Duration 的行为

let dateComponents = DateComponents(year: 0,
                                    month: 0,
                                    day: 2,
                                    hour: 4,
                                    minute: 44,
                                    second: nil,
                                    weekOfYear: 2)

let ISO8601DurationString = dateComponents.toISO8601Duration(emitZeroOrNilValues: true)
print(ISO8601DurationString) // P2W2DT4H44M

特别感谢 Igor-Palaguta 在他的项目 YoutubeEngine 中的主要实现。