2015-05-06 8 views
0

Я пытаюсь получить текущую дату в Swift, используя NSDate(). Когда я создаю точку останова и останавливаю приложение, я вижу, что разница в времени на 3 часа с системным временем устройства. Приложение работает на реальном iPhone. Как это исправить?iOS NSDate() возвращает неправильное время

Я также писал в App делегатом, чтобы быть уверенным:

NSTimeZone.setDefaultTimeZone(NSTimeZone(name: "Europe/Kiev")!) 

Но она по-прежнему не работает.

+0

Почтовый индекс первых, это было бы легко решить вашу проблему. –

+0

Вот код: 'let currentDate = NSDate()' –

+0

Еще одно примечание: время устройства - это форма Киев, но я нахожусь в Словакии. Но разница во времени составляет всего 1 час, а не 3 часа, поэтому я не думаю, что она подключена. –

ответ

11

Это не возвращает неправильное время. Он возвращает ровно в нужное время. NSDate не имеет информации о часовом поясе. Прямо сейчас, мой компьютер и ваш компьютер сообщают то же самое время, когда мы называем NSDate().

NSLog отображает NSDate в UTC. Это то, что он отображает. Поэтому, если мы оба позвоним NSLog прямо сейчас, ваш компьютер будет регистрировать те же дату и время, что и мои. Потому что это одна и та же дата и время.

Если вы хотите обработать NSDate (например, чтобы отобразить дату и время для пользователя), вы используете NSCalendar. NSCalendar переводит между NSDate, который является таким же во всем мире, к значениям, которые вы хотите отображать в своем пользовательском интерфейсе, которые будут отличаться в Лондоне или Киеве. Если я посмотрю на свои часы прямо сейчас, я увижу другое время, чем вы видите на своих часах, и вот что такое NSCalendar.

0

Для Swift 2,2 эта функция сделал трюк для меня:

func getCurrentLocalDate()-> NSDate { 
    var now = NSDate() 
    let nowComponents = NSDateComponents() 
    let calendar = NSCalendar.currentCalendar() 
    nowComponents.year = NSCalendar.currentCalendar().component(NSCalendarUnit.Year, fromDate: now) 
    nowComponents.month = NSCalendar.currentCalendar().component(NSCalendarUnit.Month, fromDate: now) 
    nowComponents.day = NSCalendar.currentCalendar().component(NSCalendarUnit.Day, fromDate: now) 
    nowComponents.hour = NSCalendar.currentCalendar().component(NSCalendarUnit.Hour, fromDate: now) 
    nowComponents.minute = NSCalendar.currentCalendar().component(NSCalendarUnit.Minute, fromDate: now) 
    nowComponents.second = NSCalendar.currentCalendar().component(NSCalendarUnit.Second, fromDate: now) 
    nowComponents.timeZone = NSTimeZone(abbreviation: "GMT") 
    now = calendar.dateFromComponents(nowComponents)! 
    return now 
} 

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

5

Вот преобразования для быстрой версии 3.0:

func getCurrentLocalDate()-> Date { 
    var now = Date() 
    var nowComponents = DateComponents() 
    let calendar = Calendar.current 
    nowComponents.year = Calendar.current.component(.year, from: now) 
    nowComponents.month = Calendar.current.component(.month, from: now) 
    nowComponents.day = Calendar.current.component(.day, from: now) 
    nowComponents.hour = Calendar.current.component(.hour, from: now) 
    nowComponents.minute = Calendar.current.component(.minute, from: now) 
    nowComponents.second = Calendar.current.component(.second, from: now) 
    nowComponents.timeZone = TimeZone(abbreviation: "GMT")! 
    now = calendar.date(from: nowComponents)! 
    return now as Date 
} 
+0

спасибо. за работой –

Смежные вопросы