Swift日期文字/字符串中的日期初始化
我需要将日期初始化为已知的、固定的时间点。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
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
文档的,以及,其中讨论了解析日期,而不考虑用户所在的区域。