簡體   English   中英

Swift Date文字/日期從字符串初始化

[英]Swift Date literal / Date initialisation from string

我需要將日期初始化為已知的固定時間點。 Swift缺乏日期字面量,我嘗試過:

extension DateFormatter
{
    convenience init(_ format: String)
    {
        self.init()
        self.dateFormat = format
    }
}

extension Date
{
    init?(_ yyyyMMdd: String)
    {
        let formatter = DateFormatter("yyyyMMdd")
        self = formatter.date(from: yyyyMMdd)
    }
}

不幸的是,我不能將self = ...return formatter.date...作為初始化程序的一部分。

但是,我非常想寫:

let date = Date("20120721")

我該如何實現?

可以通過為self分配值來初始化struct 您遇到的問題是formatter.date(from:)返回一個可選參數,因此您必須先將其解包:

extension Date {
    init?(yyMMdd: String) {
        let formatter = DateFormatter("yyyyMMdd")
        guard let date = formatter.date(from: yyMMdd) else {
            return nil
        }
        self = date
    }
}

您甚至可以通過采用ExpressibleByStringLiteral協議從字符串文字中初始化日期:

extension Date: ExpressibleByStringLiteral {
    public init(stringLiteral value: String) {
        let formatter = DateFormatter("yyyyMMdd")
        self = formatter.date(from: value)!
    }
    public init(extendedGraphemeClusterLiteral value: String) {
        self.init(stringLiteral: value)
    }
    public init(unicodeScalarLiteral value: String) {
        self.init(stringLiteral: value)
    }

}

let date: Date = "20120721"

但是請注意,對於無效日期,這將在運行時崩潰。

還有兩句話:

  • 您應該將格式設置程序的語言環境設置為Locale(identifier: "en_US_POSIX")以允許解析日期字符串,而與用戶的語言環境設置無關。
  • 結果取決於當前時區,除非您還將格式化程序的時區設置為固定值(例如TimeZone(secondsFromGMT: 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM