日期工具

欢迎使用 Dated,一个 Swift 框架,旨在帮助您以符合用户心智模型而非物理时间的方式处理日期。 此框架提供用于建模日历概念的类型,其方式类似于纸质日历,确保日期和时间与用户期望保持一致,即使跨越不同的时区和日历偏好。

主要特性

CalendarDate 及其细分是基于挂历的,这意味着它们不受时区更改的影响。 这使得它们非常适合以符合用户心智模型的方式来建模日期和时间。 另一个好处是,可以使用简单的有序整数表示形式来持久化此系列类型。 但是,它们应该只在缓存中使用。

重要提示

在您的真值来源中使用 LocalDate。 如果用户更改了他们的首选日历,则必须使缓存的 CalendarDateCalendarSubdivision (Day/Week/etc.) 值失效。

安装

将以下依赖项添加到您的 Package.swift 文件中

.package(url: "https://github.com/semantical/Dated.git", from: "0.0.1")

警告

此包目前处于 beta 阶段,并且在补丁版本中可能会发生重大更改。

用法

日历细分

let localDate = LocalDate.now
let date = CalendarDate(localDate) // or: CalendarDate.now

let day   = date.day
let week  = date.week
let month = date.month
let year  = date.year

执行计算或迭代日历细分的范围。

let weekdays = Week.current.days

print(weekdays.map(\.veryShortWeekdaySymbol))
// On a system that uses a calendar with Monday as the first weekday,
// the result is ["M", "T", "W", "T", "F", "S", "S"]. If Sunday is the
// first weekday, we get ["S", "M", "T", "W", "T", "F", "S"] instead.

let today = Day.current

print(today.isInWeekend)
// Returns `true` when called on a weekend.

print(today.isToday)
// Always `true`.

// Print 10 days starting today.
for day in today..<(today + .days(10)) {
    print(day.dayOfMonth)
}

// The same day next year.
let sameDayNextYear = today + .years(1)

时间差和日期区间

您可以轻松地创建和操作时间差和日期区间。

let startDate = CalendarDate.now
let endDate = startDate + .days(5)

let interval = CalendarDateInterval(start: startDate, end: endDate)

print(interval.contains(CalendarDate.now)) // true

let duration = TimeDifference.minutes(120)
let newEndDate = startDate + duration

// Iterate over the daily intervals within the date interval.
for interval in interval.intervalsPerDay() {
    // ...
}