Вопрос о срочном вызове Swift 3

Кажется, метод 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. Он предоставляет функцию для получения convertDate, например, так

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 везде.

У кого-нибудь есть идеи, почему это происходит?

Ответ 1

let locale = NSTimeZone.init(abbreviation: "BST")
NSTimeZone.default = locale as! TimeZone

Попробуйте это

Ответ 2

Попробуйте это.

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)

Если вы хотите установить defaultTimeZone для объекта NSTimeZone, то в Swift 3 вы можете установить это как.

NSTimeZone.default = TimeZone(abbreviation: "BST")!

Ответ 3

Если вы используете календарь,

// * создать объект календаря *

var calendar = NSCalendar.current

// * определить компоненты календаря для использования также Часовой пояс для 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)

Идентификатор геополитической области, который идентифицирует часовой пояс.

public var идентификатор: String {get}

Примечание. Если вы хотите установить часовой пояс форматирования даты, вы можете выполнить описанный выше подход следующим образом:

dateFormatter.timeZone = TimeZone(identifier: "UTC")!