我需要将日期初始化为已知的,固定的,时间点。 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")
我怎样才能做到这一点?
答案 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)
。