Проблема часового пояса Swift 3
Похоже, что метод setDefaultTimeZone
больше не доступен в NSTimeZone
. Кто-нибудь знает замену этому?
Добавление некоторых деталей: В моем appDelegate.Свифт, У меня есть
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 ). он предоставляет функцию для получения convertedDate так
func didSelectDayView(_ dayView: DayView, animationDidFinish: Bool) {
selectedDay = dayView
selectedDate = dayView.date.convertedDate()!
}
То же самое, что и раньше, происходит и здесь...то есть я нажимаю на 2016-10-08 и он selectedDate здесь становится 2016-10-07 23: 00.
И NSTimeZone.Дефолт печатает Европа / Лондон везде.
Есть ли у кого-нибудь идеи, почему это это происходит?
3 ответа:
let locale = NSTimeZone.init(abbreviation: "BST") NSTimeZone.default = locale as! TimeZone
Попробуйте это
Попробуйте вот так.
TimeZone.ReferenceType.default = TimeZone(abbreviation: "BST")!
Edit: я использовал этот
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 }
Примечание : Если вы хотите установить часовой пояс date formatter, вы можете следовать приведенному выше подходу следующим образом:
dateFormatter.timeZone = TimeZone(identifier: "UTC")!