字符串

时间:2017-10-12 19:52:52

标签: swift date literals

我需要将日期初始化为已知的,固定的,时间点。 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")

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:4)

可以通过为struct分配值来初始化self。 您的问题是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)