Swift 3 时区问题
Swift 3 timezone issue
似乎 setDefaultTimeZone
方法在 NSTimeZone
中不再可用。有人知道这个的替代品吗?
在我的 AppDelegate.swift
中,我有:
NSTimeZone.default = TimeZone(abbreviation: "BST")!
它按预期工作,我猜是因为在所有其他文件中,我将 NSTimeZone
设置为此值
现在,在我的 Utils 中,我有这个方法:
static func getDate(_ dateStr: String) -> Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
// dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
let date = dateFormatter.date(from: dateStr)!
return date
}
所以,可以说,我给它输入 2016-10-07
,它返回给我 2016-10-06 23:00
。为什么?如果您取消注释上面代码中的行,它就会得到修复。我不想在任何地方都使用这条线。
例如,在我项目的其他部分,我使用了CVCalendar
。它提供了一个像这样获取 convertedDate 的函数
func didSelectDayView(_ dayView: DayView, animationDidFinish: Bool) {
selectedDay = dayView
selectedDate = dayView.date.convertedDate()!
}
这里也发生了和以前一样的事情...那就是我点击了 2016-10-08
,这里的 selectedDate
变成了 2016-10-07 23:00
。
并且 NSTimeZone.Default
到处打印 Europe/London
。
有人知道为什么会这样吗?
这样试试。
TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")!
编辑: 我已经将此 TimeZone
与 DateFormatter
一起使用,并获得了正确的 BST
时间和日期。
TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")!
let formatter = DateFormatter()
formatter.timeZone = TimeZone.ReferenceType.default
formatter.dateFormat = "yyyy-MM-dd HH:mm"
let strDate = formatter.string(from: Date())
print(strDate)
如果你想为 NSTimeZone
对象设置 defaultTimeZone
那么在 Swift 3 你可以这样设置。
NSTimeZone.default = TimeZone(abbreviation: "BST")!
如果您正在使用日历,
// * 创建日历对象 *
var calendar = NSCalendar.current
// * 定义要同时使用的日历组件 Timezone to UTC *
let unitFlags = Set<Calendar.Component>([.hour, .year, .minute])
calendar.timeZone = TimeZone(identifier: "UTC")!
/// Returns a time zone initialized with a given identifier.
///
/// An example identifier is "America/Los_Angeles".
///
/// If `identifier` is an unknown identifier, then returns `nil`.
public init?(identifier: String)
The geopolitical region identifier that identifies the time zone.
public var identifier: String { get }
注意 : 如果你想设置日期格式化程序时区,你可以按照上面的方法:
dateFormatter.timeZone = TimeZone(identifier: "UTC")!
let locale = NSTimeZone.init(abbreviation: "BST")
NSTimeZone.default = locale as! TimeZone
试试这个
似乎 setDefaultTimeZone
方法在 NSTimeZone
中不再可用。有人知道这个的替代品吗?
在我的 AppDelegate.swift
中,我有:
NSTimeZone.default = TimeZone(abbreviation: "BST")!
它按预期工作,我猜是因为在所有其他文件中,我将 NSTimeZone
设置为此值
现在,在我的 Utils 中,我有这个方法:
static func getDate(_ dateStr: String) -> Date {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
// dateFormatter.timeZone = TimeZone(abbreviation: "GMT")
let date = dateFormatter.date(from: dateStr)!
return date
}
所以,可以说,我给它输入 2016-10-07
,它返回给我 2016-10-06 23:00
。为什么?如果您取消注释上面代码中的行,它就会得到修复。我不想在任何地方都使用这条线。
例如,在我项目的其他部分,我使用了CVCalendar
。它提供了一个像这样获取 convertedDate 的函数
func didSelectDayView(_ dayView: DayView, animationDidFinish: Bool) {
selectedDay = dayView
selectedDate = dayView.date.convertedDate()!
}
这里也发生了和以前一样的事情...那就是我点击了 2016-10-08
,这里的 selectedDate
变成了 2016-10-07 23:00
。
并且 NSTimeZone.Default
到处打印 Europe/London
。
有人知道为什么会这样吗?
这样试试。
TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")!
编辑: 我已经将此 TimeZone
与 DateFormatter
一起使用,并获得了正确的 BST
时间和日期。
TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")!
let formatter = DateFormatter()
formatter.timeZone = TimeZone.ReferenceType.default
formatter.dateFormat = "yyyy-MM-dd HH:mm"
let strDate = formatter.string(from: Date())
print(strDate)
如果你想为 NSTimeZone
对象设置 defaultTimeZone
那么在 Swift 3 你可以这样设置。
NSTimeZone.default = TimeZone(abbreviation: "BST")!
如果您正在使用日历,
// * 创建日历对象 *
var calendar = NSCalendar.current
// * 定义要同时使用的日历组件 Timezone to UTC *
let unitFlags = Set<Calendar.Component>([.hour, .year, .minute])
calendar.timeZone = TimeZone(identifier: "UTC")!
/// Returns a time zone initialized with a given identifier. /// /// An example identifier is "America/Los_Angeles". /// /// If `identifier` is an unknown identifier, then returns `nil`. public init?(identifier: String)
The geopolitical region identifier that identifies the time zone.
public var identifier: String { get }
注意 : 如果你想设置日期格式化程序时区,你可以按照上面的方法:
dateFormatter.timeZone = TimeZone(identifier: "UTC")!
let locale = NSTimeZone.init(abbreviation: "BST")
NSTimeZone.default = locale as! TimeZone
试试这个