Swift DateFormatter 速查表、公式和示例

478 阅读6分钟

原文:Swift DateFormatter Cheatsheet [+Formulas, Parsing]

了解如何使用 DateFormatter 从日期中解析、格式化和提取日期组件。使用 Cheatsheet 创建 DateFormatter 的公式。

在 Swift 中操作和格式化日期是一项常见任务。本文介绍了使用 DateFormatterDate 和其他结构体的示例,这些结构体支持从日期和日期字符串中解析、格式化和获取日期组件。

Date Formulas 速查表

Formulas输出样式
yy.MM.dd23.01.16
yyyy/MM/dd2023/01/16
yyyy-MM-dd HH:mm2023-01-16 00:10
MMM d, h:mm aJan 16, 0:10 AM
yyyy, MMM d,EEEE2023, Jan 16, Monday
yyyy-MM-dd’T’HH:mm:ssZ2023-01-16T00:10:00-0600

Date Format 速查表

FORMULA描述示例
yyyy4位数字的年份2022
yy2位数字的年份22
M1 或 2 位数月份8
MM2 位数月份08
MMM数字+月8月
MMMM本地化月份八月
d1 或 2 位数的月份日期2
DD2 位数的月份日期02
D一年中的第几天215
HH2 位数小时(24 小时格式)13
h1 或 2 位数小时(12 小时格式)1
hh2 位数小时(12 小时格式)01
H1 或 2 位数小时(24 小时格式13
m1 或 2 位数字分钟2
mm2 位数字分钟02
s1 或 2 位数字秒2
ss2 位秒数02
a12 小时格式的 AM/PMPM

使用 DateFormatter 将日期格式化为字符串

DateFormatter 上的 dateFormat 属性指定 DateFormatter 实例如何解析和格式化日期。将 dateFormat 设置为格式化字符串后,使用格式化的日期字符串调用 date(from:) 将日期字符串解析为 Date

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy"
let date = dateFormatter.date(from: "01/16/2023")
print(date) // Optional(2023-01-16 00:10:00 +0000)

日期格式(dateStyle)、时间格式(timeStyle)

DateFormatter 有一个用于指定日期的日期格式的接口,即 dateStyle 属性。

DateFormatter 还有另一个用于指定日期时间格式的接口,即 timeStyle 属性。

描述dateStyletimeStyle
.none不显示时间/日期--
.short时间/日期以短格式显示11/23/19373:30 PM
.medium时间/日期以中等格式显示Nov 23, 19373:30:32 PM
.long时间/日期以长格式显示November 23, 19373:30:32 PM PST
.full时间/日期以最详细的格式显示,包括星期和纪元/时区和秒Tuesday, April 12,
1952 AD3:30:32 PM Pacific
Standard Time
// 自定义 dateStyle 
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
let dateString = dateFormatter.string(from: Date())
print(dateString) // "Jan 16, 2023"

// 自定义 timeStyle
let dateFormatter = DateFormatter()
dateFormatter.timeStyle = .medium
let timeString = dateFormatter.string(from: Date())
print(timeString) // "00:10:00 AM"

本地化(locale)

要控制格式化日期中的语言和区域特定信息,请使用 DateFormatter 上的 locale 属性。

// 将 locale 属性设置为法国
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM d, yyyy"
dateFormatter.locale = Locale(identifier: "fr_FR")
let date = dateFormatter.string(from: Date())
print(date) // "janvier 16, 2023"

// 将 locale 属性设置为中国
let formatter = DateFormatter() // 1.实例化
formatter.locale = Locale(identifier: "zh_CN") // 2.设置本地化信息
formatter.dateStyle = .short // 3.设置日期风格
formatter.timeStyle = .none // 4.设置时间风格
formatter.dateFormat = "yyyy-MM-dd" // 5.设置自定义日期和时间格式
formatter.timeZone = TimeZone(abbreviation: "GMT+8:00") // 6.设置时区

要将locale 属性设置为用户的设备设置,请使用 .autoupdatingCurrent

dateFormatter.locale = Locale.autoupdatingCurrent

日历(calendar)

要控制用于格式化日期的日历,请使用 DateFormatter 上的 calendar 属性。

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMMM d, yyyy"
dateFormatter.calendar = Calendar(identifier: .islamic)
let date = dateFormatter.string(from: Date())
print(date) // "Jumada II 22, 1444"

Calendar 速查表

Calendar描述
gregorian世界上大部分地区使用的公历
buddhist泰国和其他佛教徒占多数的国家使用的佛历
chinese中国农历,在中国和其他拥有大量华人人口的国家使用
coptic科普特历,用于科普特东正教教堂
ethiopicAmeteAlem埃塞俄比亚历,也称为埃塞俄比亚东正教特瓦赫多教会历
ethiopicAmeteMihret埃塞俄比亚历,也称为埃塞俄比亚东正教特瓦赫多教会历
hebrew以色列和其他犹太社区使用的希伯来历
iso8601ISO 8601 日历,日期和时间表示的国际标准
indian印度国历,用于印度和其他拥有大量印度人口的国家
islamic世界各地穆斯林社区使用的伊斯兰历
islamicCivil世界各地穆斯林社区使用的伊斯兰历
japanese日本使用的日历
persian波斯历,在伊朗和其他拥有大量波斯人口的国家使用
roc中华民国历,用于台湾和其他华人社区

将字符串转换为日期

除了格式化日期和时间之外,还可以使用 DateFormatter 将字符串解析为日期。就像格式化日期一样,将 DateFormatter 上的 dateFormat 设置为日期字符串的格式。然后,调用 date(from:) 传入日期字符串以获取解析后的日期:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateString = "2023-01-16"
let date = dateFormatter.date(from: dateString)
print(date) // Optional(2023-01-16 00:10:00 +0000)

Date Components

DateComponents 是一个结构体,可以使用日期的特定组成部分,例如年、月或日。

通过 Date Components 创建 Date

要通过指定每个单独的日期组件在 Swift 中创建日期,请使用 DateComponents

var components = DateComponents()
components.day = 15
components.month = 1
components.year = 2023
components.hour = 0
components.minute = 10

let date = Calendar.current.date(from: components)

通过 Date 获取 Date Components

要从 Date 中获取日期组件(例如天数),请使用 DateComponents

// Use the user's set calendar
let calendar = Calendar.autoupdatingCurrent

// Get the year, month, and day from the date
let components = calendar.dateComponents(
[.year, .month, .day], 
from: Date()
)

// Reference the date components
nowComponents.year
nowComponents.month
nowComponents.day

在 Swift 中解析和格式化日期

就是这样!通过使用 DateFormatterDateCalendarDateComponents,你可以在 Swift 中解析、格式化和使用日期组件。

附件

DateExtensions.swift

extension Date {
    /// 给定一个 UTC iSO8601 格式的字符串,创建一个 Date 对象
    /// 参考:<https://medium.com/livefront/10-swift-extensions-we-use-at-livefront-8b84de32f77b>
    ///
    ///     let utcDateString = "2021-04-03T14:00:00.000Z"
    ///     let utcDate = Date.utcDate(from: utcDateString)
    ///
    /// - Parameter utcString: 用于创建日期的字符串
    /// - Returns: 根据给定字符串返回的日期
    static func utcDate(from utcString: String) -> Date? {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone(abbreviation: "UTC")! // swiftlint:disable:this force_unwrapping
        return formatter.date(from: utcString)
    }
}

DateFormatterExtensions.swif

import Foundation
import CodableWrapper

extension DateFormatter {
    /// 创建一个 iSO8601 格式 DateFormatter 实例的静态方法
    /// 2022-04-27T02:12:12.185+0000
    static let iso8601Full: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.timeZone = TimeZone(secondsFromGMT: 3600 * 8) // 北京所在时区,东八区
        formatter.calendar = Calendar(identifier: .iso8601)
        return formatter
    }()
}

final class ISO8601FullDateTransform: DateFormatterTransform {
    init() {
        super.init(dateFormatter: DateFormatter.iso8601Full)
    }
}