Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift日期文字/字符串中的日期初始化_Swift_Date_Literals - Fatal编程技术网

Swift日期文字/字符串中的日期初始化

Swift日期文字/字符串中的日期初始化,swift,date,literals,Swift,Date,Literals,我需要将日期初始化为已知的、固定的时间点。Swift缺少日期文字,我尝试: extension DateFormatter { convenience init(_ format: String) { self.init() self.dateFormat = format } } extension Date { init?(_ yyyyMMdd: String) { let formatter = Da

我需要将日期初始化为已知的、固定的时间点。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=…
返回格式化程序.date…
作为初始值设定项的一部分来编写

然而,我非常想写:

let date = Date("20120721")
如何实现这一点?

您可以通过给
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"
但是请注意,这将在运行时因无效日期而崩溃

还有两点意见:

  • 您应该将格式化程序区域设置为
    区域设置(标识符:“en_US_POSIX”)
    ,以允许独立于 用户的区域设置
  • 结果取决于当前时区,除非 将格式化程序时区设置为固定值(例如
    时区(secondsFromGMT:0)
您可以通过给
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"
但是请注意,这将在运行时因无效日期而崩溃

还有两点意见:

  • 您应该将格式化程序区域设置为
    区域设置(标识符:“en_US_POSIX”)
    ,以允许独立于 用户的区域设置
  • 结果取决于当前时区,除非 将格式化程序时区设置为固定值(例如
    时区(secondsFromGMT:0)

请注意,在日期格式字符串中,月份的值应该是
MM
。注意,在日期格式字符串中,月份的值应该是
MM
。好吧,那太棒了!我了解到我实际上可以为结构分配self(这不会改变指针吗?)还有一个ExpressibleByStringLiteral协议。超出了我的预期。谢谢!!!!我想进一步强调Martin的最后一句话-这些话至少需要用粗体、下划线、斜体、42磅字体。照此,在运行时,你会看到在你没有考虑的地区/时区解析失败。日期格式很高y地区/日历/时区敏感,默认情况下使用用户的当前值。除非将地区设置为明确的值(如
en\u US\u POSIX
),否则这样做是不安全的并将时区设置为UTC。请参阅
NSDateFormatter
文档的,以及,其中讨论了解析日期,而不考虑用户所在的区域。这太棒了!我了解到我实际上可以为结构分配self(这不会改变指针吗?)还有一个ExpressibleByStringLiteral协议。超出了我的预期。谢谢!!!!我想进一步强调Martin的最后一句话-这些话至少需要用粗体、下划线、斜体、42磅字体。照此,在运行时,你会看到在你没有考虑的地区/时区解析失败。日期格式很高y地区/日历/时区敏感,默认情况下使用用户的当前值。除非将地区设置为明确的值(如
en\u US\u POSIX
),否则这样做是不安全的并将时区设置为UTC。请参阅
NSDateFormatter
文档的,以及,其中讨论了解析日期,而不考虑用户所在的区域。