欢迎使用 Dated,一个 Swift 框架,旨在帮助您以符合用户心智模型而非物理时间的方式处理日期。 此框架提供用于建模日历概念的类型,其方式类似于纸质日历,确保日期和时间与用户期望保持一致,即使跨越不同的时区和日历偏好。
CalendarDate
: 一种类型,存储精确到秒的日历组件,确保无论时区如何,都能正确解释日期。LocalDate
: 一种类型,同时存储时区和日期值,允许无论日历如何,都能正确解释日期。Day
, Week
, Month
, Year
: 用于表示天、周、月和年的类型,符合 CalendarSubdivision
协议,使其易于执行计算和迭代范围。CalendarDateInterval
: 一种类型,用于表示特定开始日期和结束日期之间的时间跨度。CalendarDate
及其细分是基于挂历的,这意味着它们不受时区更改的影响。 这使得它们非常适合以符合用户心智模型的方式来建模日期和时间。 另一个好处是,可以使用简单的有序整数表示形式来持久化此系列类型。 但是,它们应该只在缓存中使用。
重要提示
在您的真值来源中使用 LocalDate
。 如果用户更改了他们的首选日历,则必须使缓存的 CalendarDate
或 CalendarSubdivision
(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() {
// ...
}