灵感来源于 Java 8 DateTime API 的 Swift 日期 & 时间 API。
我认为日期 & 时间 API 应该易用且准确。
Swift 之前的日期、时间、时区 API 使用起来很不方便。(创建、操作或任何其他事情都非常复杂。)
但是有一个非常棒的先驱,Java 8 全新的时间 API。
Java 8 引入了全新的 API,可以更高效、更轻松地处理日期 & 时间,也就是 LocalDateTime、ZonedDateTime(JSR-310)。其主要思想是
这些思想可以很容易地移植到其他语言,例如 .Net 的 Rx 端口和其他语言。
所以,这就是 AnyDate,一个全新的 Swift 日期 & 时间 API,它与 Java 8 具有一致性。
/// 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)
/// 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)
pod 'AnyDate', '~> 1.2.0'
github "kawoou/AnyDate" ~> 1.2.0
import PackageDescription
let package = Package(
name: "MyAwesomeApp",
dependencies: [
.Package(url: "https://github.com/kawoou/AnyDate", majorVersion: 1),
]
)
您可以简单地将 Sources
文件夹拖放到您现有的项目中。
Calendar(identifier: .iso8601)
在 swift SR-3828 上的崩溃。AnyDate 基于 MIT 许可证。有关更多信息,请参见 LICENSE 文件。