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")!

编辑: 我已经将此 TimeZoneDateFormatter 一起使用,并获得了正确的 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

试试这个