DateTemplates

DateTemplates 是一个库,它提供了一种简单的方法来生成日期格式化模板,这些模板可用于在所有 Apple 平台和 Linux 中格式化日期。凭借易于阅读且自然编写的声明式 Swift 语法,DateTemplate 可以与 DateFormatter 无缝协作。自动支持本地化使得使用自定义日期格式比以往任何时候都更容易。

声明式语法

DateTemplates 使用声明式语法,因此您可以简单地声明应在格式化的日期字符串中包含哪些元素。例如,您可以编写您想要包含完整星期几和时间的日期,而无需担心模板符号、本地化差异或时钟格式。

let template = DateTemplate().dayOfWeek(.full).time()
print(template.localizedString(from: Date()))

此模板将按如下方式呈现日期

Locale(区域设置) Formatted String(格式化字符串)
"en_US" "Thursday 12:00 AM"
"es_ES" "jueves, 0:00"
"ja_JP" "木曜日 0:00"
"ru_RU" "четверг 00:00"
"ar_EG" "الخميس ١٢:٠٠ ص"

示例

以下示例假设时区为 "America/Los_Angeles",区域设置为 "en_US"

Template(模板) Formatted String(格式化字符串)
DateTemplate().time().timeZone() "12:00 AM PST"
DateTemplate().dayOfWeek().day().month(.abbreviated).year() "Thu, Jan 1, 1970"
DateTemplate().day().month(.abbreviated).year(length: 2).era() "Mar 15, 44 BC"

底层原理

DateTemplate 实例提供了一种声明式方法来组合日期格式化模板字符串。 这些是可以与 DateFormatter 一起使用的常规标准模板。

let dateTemplate = DateTemplate().year().month().day().hours().minutes()
print(dateTemplate.template) // "yMdjmm"

这些模板字符串可用于生成本地化的日期格式

let template = DateTemplate().year().month().day().hours().minutes().template
let format = DateFormatter.dateFormat(fromTemplate: template, options: 0, locale: nil) ?? template
print(format) // "M/d/y, h:mm a" (assuming en_US locale)

为方便起见,DateTemplate 提供了一个 localizedFormat 方法

let template = DateTemplate().year().month().day().hours().minutes()
let format = template.localizedFormat()
print(format) // "M/d/y, h:mm a" (assuming en_US locale)

本地化的格式字符串可以与 DateFormatter 一起使用,以将日期转换为字符串(反之亦然)

let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US")
formatter.dateFormat = format // "M/d/y, h:mm a" 
formatter.timeZone = TimeZone(secondsFromGMT: 0)
let string = formatter.string(from: Date(timeIntervalSince1970: 0))
print(string) // "1/1/1970, 12:00 AM"

为方便起见,DateTemplate 提供了一个 localizedString 方法

let template = DateTemplate().year().month().day().hours().minutes()
let string = template.localizedString(from: Date(timeIntervalSince1970: 0),
                                      locale: Locale("en_US"), 
                                      timeZone: TimeZone(secondsFromGMT: 0))
print(string) // "1/1/1970, 12:00 AM"

使用 DateTemplates 的好处

以下是一些好处

安装

对于 Xcode 项目 🛠

通过 File -> Swift Packages -> Add Package Dependency... 将 Swift Package 添加到 Xcode

对于 Swift Packages 📦

将 DateTemplates 依赖项添加到 Packages.swift

dependencies: [
    // other dependencies
    .package(url: "https://github.com/eneko/DateTemplates", from: "0.1.0")
],
targets: [
    .target(name: "YourPackage", dependencies: [
        // other dependencies
        "DateTemplates"
    ]),
    // other targets
]

许可证

MIT 许可证

版权所有 (c) 2020 Eneko Alonso