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 ( https://github.com/Mozharovsky/CVCalendar). Он предоставляет функцию для получения convertDate, как так

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

То же самое, что и раньше, происходит и здесь... то есть я нажимаю на 2016-10-08, и он выбирается. Дата здесь становится 2016-10-07 23:00.

И NSTimeZone.Default печатает Европу / Лондон повсюду.

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

3 ответа

Решение
let locale = NSTimeZone.init(abbreviation: "BST")
NSTimeZone.default = locale as! TimeZone

Попробуй это

Попробуй вот так.

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

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

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

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)

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

общедоступный идентификатор var: String { get }

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

dateFormatter.timeZone = TimeZone(identifier: "UTC")!
Другие вопросы по тегам