Parse3339 是一个用纯 Swift 编写的快速 RFC 3339 时间戳解析器。
RFC 3339 指定了 ISO 8601 中常用于时间戳的子集。此解析器进一步限制了该子集。Parse3339 支持以下格式:
2023-07-09T113:14:00+03:00
2023-07-09T113:14:00.2+03:00
2023-07-09T113:14:00Z
2023-07-09T113:14:00.2Z
无需任何配置,并且为了方便您复制粘贴而不是将其用作软件包,所有代码都位于单个文件中。
import Parse3339
let s = "2023-07-09T13:14:00+03:00"
guard let parts = Parse3339.parse(s) else {
return
}
let date = parts.date
print(date.timeIntervalSinceReferenceDate)
// output: 710590440.0
您可以使用一个辅助函数与 Foundation 的 JSONDecoder
结合使用
import Parse3339
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .custom(Parse3339.parseFromDecoder(_:))
有关 Package.swift
代码片段和文档,请访问 Swift Package Index 页面。
Parse3339 速度快且内存占用小。该软件包包含基准测试
env PARSE3339_BENCHMARK=1 swift package benchmark --target ParserBenchmarks
它包含一些基准测试,这些测试使用 Foundation 的 DateFormatter
、Foundation 的 ISO8601DateFormatter
、Parse3339 通过 Foundation 的 DateComponents
和 Calendar
创建 Date
以及 Parse3339 通过标准 Unix 函数创建 Date
来解析相同的字符串。
一次运行的输出结果
Parse with DateFormatter
╒════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric │ p0 │ p25 │ p50 │ p75 │ p90 │ p99 │ p100 │ Samples │
╞════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Malloc (total) │ 275 │ 275 │ 275 │ 275 │ 275 │ 275 │ 279 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (M) │ 11 │ 15 │ 19 │ 23 │ 25 │ 27 │ 27 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K) │ 17 │ 16 │ 16 │ 16 │ 15 │ 12 │ 1 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns) │ 59084 │ 59967 │ 60255 │ 61887 │ 64927 │ 82175 │ 236750 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns) │ 58500 │ 59391 │ 59647 │ 61279 │ 64255 │ 83327 │ 513167 │ 100000 │
╘════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛
Parse with ISO8601DateFormatter
╒════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric │ p0 │ p25 │ p50 │ p75 │ p90 │ p99 │ p100 │ Samples │
╞════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Malloc (total) │ 496 │ 496 │ 496 │ 496 │ 496 │ 496 │ 497 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (K) │ 9764 │ 9781 │ 9781 │ 9781 │ 9781 │ 9781 │ 9781 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K) │ 11 │ 10 │ 10 │ 10 │ 10 │ 7 │ 0 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns) │ 91375 │ 92351 │ 92799 │ 95551 │ 99519 │ 123007 │ 542458 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns) │ 90792 │ 91711 │ 92159 │ 94911 │ 98879 │ 127487 │ 3553542 │ 100000 │
╘════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛
Parse with Parse3339 (DateComponents)
╒════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric │ p0 │ p25 │ p50 │ p75 │ p90 │ p99 │ p100 │ Samples │
╞════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Malloc (total) │ 64 │ 64 │ 64 │ 64 │ 64 │ 64 │ 67 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (M) │ 9 │ 41 │ 73 │ 105 │ 124 │ 136 │ 137 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K) │ 43 │ 42 │ 42 │ 41 │ 38 │ 29 │ 4 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns) │ 23416 │ 23999 │ 24223 │ 25007 │ 26463 │ 34751 │ 206791 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns) │ 22833 │ 23423 │ 23631 │ 24383 │ 25807 │ 34335 │ 211458 │ 100000 │
╘════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛
Parse with Parse3339 (Unix time)
╒════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric │ p0 │ p25 │ p50 │ p75 │ p90 │ p99 │ p100 │ Samples │
╞════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Malloc (total) │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (K) │ 7831 │ 7852 │ 7864 │ 7864 │ 7864 │ 7864 │ 7864 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K) │ 263 │ 252 │ 247 │ 242 │ 233 │ 183 │ 17 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns) │ 4333 │ 4503 │ 4543 │ 4667 │ 4875 │ 6543 │ 48584 │ 100000 │
├────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns) │ 3791 │ 3959 │ 4041 │ 4127 │ 4291 │ 5459 │ 56625 │ 100000 │
╘════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛