SwiftyDates - 以正确的方式完成字符串到日期的转换

处理日期和时间可能很痛苦。这个项目旨在使其稍微减轻一些痛苦。这个库绝不是完整的,也不是可以完全不用担心地使用的状态,但是当涉及到处理不同格式的日期时,它应该会让生活轻松得多。

为什么你需要它?

即使你得到像 ISO 8601 这样的格式的日期,事情也会很快变得混乱。主要是因为 ISO 8601 并不像 Swift 希望的那样静态。例如,以 ISO 8601 格式的日期 2018-03-08T15:49:46Z 为例。在 Swift 中解析这个字符串看起来像这样

let dateString = "2018-03-08T15:49:46Z"
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
dateFormatter.dateFormat = "YYYYMMdd'T'HHmmss'Z'"
let date:Date? = dateFormatter.string(from: dateString) // this will work.

到目前为止一切都很好。现在,如果我们得到另一个日期,比如:2018-03-08T15:49:46.5+03:30 现在 Swift 会抛出异常,因为指定的格式 YYYYMMdd'T'HHmmss'Z' 不再适用。

let dateString = "2018-03-08T15:49:46.5+03:30"
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
dateFormatter.dateFormat = "YYYYMMdd'T'HHmmss'Z'"
let date:Date = dateFormatter.string(from: dateString) // this will not work.

使用 SwiftyDates,你只需要这样做

let dateString = "2018-03-08T15:49:46Z"
let date:Date? = dateString.swiftyDateTime() // this will work

同样,另一个日期也适用

let dateString = "2018-03-08T15:49:46.5+03:30"
let date:Date = dateString.swiftyDateTime() // this will work

日期

对于日期,你可以使用

let dateString = "2018-03-08"
let date:Date = dateString.swiftyDate() // this will work

时间

对于日期,你可以使用

let dateString = "9:30am"
let date:TimeInterval = dateString.swiftyTime() // this will work

示例

这个库的优点在于它也理解其他格式,例如

10.12.2017
12:30
12/25/2016

或者组合使用

12/25/2016 3:45pm
20.10.2018 23:10

假设

  1. 人类是混乱和无结构的。日期通常是由于人类而输入的。因此,我们正在处理一个烂摊子,并试图从中获得最好的结果。
  2. 专注于实际用途
  3. 年份总是以 4 位数字给出,或与月份和日期组合使用
  4. 没有日期的时间是自一天开始以来的秒数
  5. 没有时间的日期的时间为 00:00:00 (hh-mm-ss)
  6. 如果日期/时间不起作用,我们不会抛出异常,而是返回 nil

限制 / 待办事项

  1. 不支持序数日期
  2. 不支持星期几
  3. 不支持文本日期(“1991 年 11 月 2 日”)

性能

最初的初步测试表明,SwiftyDates 的速度大约是 DateFormatter 的一半。考虑到增加的功能和灵活性,这似乎是一个公平的权衡。应该进行更多的性能测试,并进一步优化代码。