AnyDate
受Java 8 DateTime API启发的Swifty日期和时间API。
背景
我认为日期和时间API应该是简单且准确的。
Swift之前提供的日期、时间、时区API使用不便。 (创建、操作等非常复杂。)
但有一个很好的先驱,那就是 Java 8全新的Time API。
Java 8引进了一套全新的API,用于更高效、更简单地处理日期和时间,即LocalDateTime,ZonedDateTime(JSR-310)。 主要思想是
- 不可变值类
- 领域驱动设计
- 时间线分离
这些想法可以轻松移植到其他语言,例如 .Net 的 Rx 是其他语言的端口。
因此,这里是AnyDate,一个全新的Swift日期和时间API,它与Java 8具有一致性。
功能
- 方便的年份、月份、日期、时间类型。
- 预定义时区标识符。
- 空安全类型。
- 时间线分离。
- 与Java一致。
- 支持操作符。
- 易于操作。
常见问题解答(FAQ)
- 看起来像是SwiftDate?
- SwiftDate是一个支持库,用于处理日期,AnyDate可以完全替代Date。
使用方法
- 方便的年份、月份、日期、时间类型。
/// Before
let now1 = Date()
var calendar = Calendar.current
calendar.timeZone = TimeZone(identifier: "UTC")!
let day = calendar.components(.day, from: now1)
/// After
let now2 = ZonedDateTime(Clock.utc)
let day = now2.day
- 预定义时区标识符。字符串类型的时区容易受到您输入错误的影响。(请相信您的手,它们可能总会背叛你。)
/// Before
let timeZone1 = TimeZone(identifier: "GMT+0900")!
let timeZone2 = TimeZone(identifier: "America/Argentina/Buenos_Aires")!
/// After
let clock1 = Clock(offsetHour: 9)
let clock2 = Clock(identifier: .americaArgentinaBuenosAires)
- 空安全类型。不需要更多的冗余守卫 & 可选和缩进增加 :-D
/// Before
var dateComponents = DateComponents()
dateComponents.year = 2000
dateComponents.month = 11
dateComponents.day = 30
dateComponents.hour = 11
dateComponents.minute = 51
dateComponents.second = 18
dateComponents.nanosecond = 1573
guard let date = Calendar.current.date(from: dateComponents) else {
assertionFailure("Failed to create!")
return
}
/// After
let date = LocalDateTime(
year: 2000,
month: 11,
day: 30,
hour: 11,
minute: 51,
second: 18,
nanoOfSecond: 1573
)
- 支持的操作符。易于比较日期、日期时间和时间。
let min = ZonedDateTime.min
let max = ZonedDateTime.max
let oldDate = ZonedDateTime(year: 1627, month: 2, day: 10, hour: 14, minute: 2, second: 18, nanoOfSecond: 1573, clock: .UTC)
let newDate = ZonedDateTime(year: 1627, month: 2, day: 10, hour: 14, minute: 2, second: 18, nanoOfSecond: 1574, clock: .UTC)
let equalDate = ZonedDateTime(year: 1627, month: 2, day: 10, hour: 14, minute: 2, second: 18, nanoOfSecond: 1573, clock: .UTC)
let isLessThan = min < oldDate
let isGreaterThan = max > newDate
let isLessThanOrEqual = oldDate <= equalDate
let isGreaterThanOrEqual = oldDate >= equalDate
let isEqual = oldDate == equalDate
let isLessThan = oldDate < newDate
- 易于操控。您可以使用我们的重载操作符来创建/增加/减少日期和时间。
/// 1000-01-07T11:51:18.000001573
let date = LocalDateTime(
year: 1000,
month: 1,
day: 7,
hour: 11,
minute: 51,
second: 18,
nanoOfSecond: 1573
)
print(date)
/// Period(year: 1, month: 1, day: 9, hour: 2, minute: 3, second: 4, nano: 152)
let period = 1.year + 1.month + 1.week + 2.day + 2.hour + 3.minute + 4.second + 152.nanosecond
/// 1001-03-16T13:54:22.000001725
let newDate = date + period
print(newDate)
安装
CocoaPods
pod 'AnyDate', '~> 1.2.0'
Carthage
github "kawoou/AnyDate" ~> 1.2.0
Swift Package Manager
import PackageDescription
let package = Package(
name: "MyAwesomeApp",
dependencies: [
.Package(url: "https://github.com/kawoou/AnyDate", majorVersion: 1),
]
)
手动
您可以将源文件夹
直接拖入您现有的项目。
要求
- Swift 3.1
- iOS 8.0+
- tvOS 9.0+
- macOS 10.10+
- watchOS 2.0+
- 几乎所有的与Swift 3兼容且实现Swift Foundation库的平台。
变更日志
- 1.0.0 - 2017/08/13
- AnyDate首次发布!
- 1.0.1 - 2017/08/16
- 增加测试代码。
- 实现CustomPlaygroundQuickLookable和CustomReflectable协议。
- 1.0.2 - 2017/08/26
- 增加测试代码。
- 支持Swift 4中的Codable协议。
- 在Instant上添加运算符。
- 1.0.3 - 2017/09/03
- 修复热修复,Comparable错误。
- 1.0.4 - 2017/10/07
- 修复swift SR-3828中的
Calendar(identifier: .iso8601)
崩溃。
- 修复swift SR-3828中的
- 1.0.5 - 2018/04/11
- 支持Swift 4.1和Xcode 9.3。
- 1.0.6 - 2018/05/20
- 支持Hashable。
- 1.1.0 - 2018/10/18
- 支持Swift 4.2。
- 1.2.0 - 2019/04/04
- 支持Swift 5.0。
作者
- kawoou, [email protected]
- dave, [email protected]
特别感谢
- 命名由아메바完成。
授权协议
AnyDate 采用MIT授权。更多信息请查看LICENSE文件。