AnyDate 1.2.0

AnyDate 1.2.0

测试测试
Lang语言 SwiftSwift
许可 MIT
发布最后发布2019年4月
SPM支持SPM

Kawoou维护。



AnyDate 1.2.0

AnyDate

Awesome Swift Carthage compatible Version License CI Status Codecov Platform Jazzy

受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)崩溃。
  • 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。

作者

特别感谢

  • 命名由아메바完成。

授权协议

AnyDate 采用MIT授权。更多信息请查看LICENSE文件。