Swift 3时区问题

Amr*_*taB 13 nstimezone ios swift3

似乎setDefaultTimeZone方法已不再可用NSTimeZone.有人知道替代品吗?

添加一些细节:在我的appDelegate.swift中,我有

NSTimeZone.default = TimeZone(abbreviation: "BST")!
Run Code Online (Sandbox Code Playgroud)

它的工作原理我猜是因为在所有其他文件中,我将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
}
Run Code Online (Sandbox Code Playgroud)

所以,让我们说,我给它输入"2016-10-07",它给了我2016-10-06 23:00.为什么?如果取消注释上面代码中的行,它将得到修复.我不想到处都用这条线.

例如,在我的项目的其他部分,我使用了CVCalendar(https://github.com/Mozharovsky/CVCalendar).它提供了一个像这样获得convertedDate的函数

func didSelectDayView(_ dayView: DayView, animationDidFinish: Bool) {
    selectedDay = dayView
    selectedDate = dayView.date.convertedDate()!
}
Run Code Online (Sandbox Code Playgroud)

和以前一样的事情也发生在这里......那就是我点击2016-10-08,它在这里选择日期变成2016-10-07 23:00.

NSTimeZone.Default随处可见欧洲/伦敦.

有谁知道为什么会这样?

Nir*_*v D 13

试试这样吧.

TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")!
Run Code Online (Sandbox Code Playgroud)

编辑:我已经使用这个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)
Run Code Online (Sandbox Code Playgroud)

如果你想设置defaultTimeZoneNSTimeZone对象,然后在斯威夫特3,你可以这样设置.

NSTimeZone.default = TimeZone(abbreviation: "BST")!
Run Code Online (Sandbox Code Playgroud)


Jit*_*odi 8

let locale = NSTimeZone.init(abbreviation: "BST")
NSTimeZone.default = locale as! TimeZone
Run Code Online (Sandbox Code Playgroud)

试试这个

  • 没有必要创建`NSTimeZone`的实例,然后将其转换为`TImeZone`,而不是像我的答案一样用`TimeZone(缩写:)`直接创建对象. (3认同)
  • 我知道,但是有点容易理解 (2认同)