NaiveDate(朴素日期)

标准的 Date 类型非常适合处理时间戳和时区(例如 2024-09-29T15:00:00+0300),但在某些情况下,您可能不知道或不在意时区。 这些类型的日期通常被称为朴素日期。

用法

NaiveDate 库实现了三种类型

它们都实现了 EquatableComparableLosslessStringConvertibleCodable 协议。 朴素日期类型也可以转换为 DateDateComponents

创建

朴素日期和时间可以从字符串创建(使用预定义的格式 – RFC 3339),使用 Decodable,或使用成员逐一初始化器。

NaiveDate("2024-10-01")
NaiveDate(year: 2024, month: 10, day: 1)

NaiveTime("15:30:00")
NaiveTime(hour: 15, minute: 30, second: 0)

NaiveDateTime("2024-10-01T15:30")
NaiveDateTime(
    date: NaiveDate(year: 2024, month: 10, day: 1),
    time: NaiveTime(hour: 15, minute: 30, second: 0)
)

格式化

NaiveDate 支持 Foundation.FormatStyle

let dateTime = NaiveDateTime("2024-11-01T15:30:00")!
dateTime.formatted(date: .numeric, time: .standard)
// prints "11/1/2024, 3:30:00 PM"

除了格式样式外,您还可以直接使用内置的 NaiveDateFormatter

let date = NaiveDate("2024-11-01")!
NaiveDateFormatter(dateStyle: .short).string(from: date)
// prints "Nov 1, 2024"

let time = NaiveTime("15:00")!
NaiveDateFormatter(timeStyle: .short).string(from: time)
// prints "3:00 PM"

let dateTime = NaiveDateTime("2024-11-01T15:30:00")!
NaiveDateFormatter(dateStyle: .short, timeStyle: .short).string(from: dateTime)
// prints "Nov 1, 2024 at 3:30 PM"

转换

当您确实需要处理时区时,只需将 NaiveDate 转换为 Date

let date = NaiveDate(year: 2024, month: 10, day: 1)

// Creates `Date` in a calendar's time zone
// "2024-10-01T00:00:00+0300" if user is in MSK
Calendar.current.date(from: date)
let dateTime = NaiveDateTime(
    date: NaiveDate(year: 2024, month: 10, day: 1),
    time: NaiveTime(hour: 15, minute: 30, second: 0)
)

// Creates `Date` in a calendar's time zone
// "2024-10-01T15:30:00+0300" if user is in MSK
Calendar.current.date(from: dateTime)

重要提示! 朴素类型之所以这样称呼,是因为它们没有关联的时区。 这意味着即使日期是“有效的”,它实际上可能在世界上的某些地区不存在。 例如,当应用夏令时更改时,时钟通常会向前或向后移动一小时。 这意味着某些日期永远不会出现,或者可能出现多次。 如果您需要对时间进行任何精确的操作,请始终使用原生的 DateCalendar

最低要求

NaiveDate(朴素日期) Swift 平台
NaiveDate 1.1 Swift 5.9 iOS 13, tvOS 13, watchOS 6, macOS 10.15
NaiveDate 1.0 Swift 5.3 iOS 11, tvOS 11, watchOS 4, macOS 10.13

许可证

NaiveDate 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。