0

В моем приложении я настраиваю локальные уведомления для некоторых событий. Однако NSDateFormatter не форматирует дату и время правильно. Когда я форматирую дату, она дает 3 часа назад. Точно так же, когда я получаю текущее время с использованием NSDate(), он дает 3 часа раньше в качестве UTC. Я столкнулся с той же проблемой для другого события в своем приложении, но я мог бы решить это, добавив dateFormatter.timeZone = NSTimeZone(name: "GMT"). В настоящее время проблемы связана с кодом ниже:NSDateFormatter не форматирует дату и время правильно

var dateFormatter1 = NSDateFormatter() 
var dateFormatter2 = NSDateFormatter() 
dateFormatter1.dateFormat = "yyyy-MM-dd" 
dateFormatter2.dateFormat = "yyyy-MM-dd HH:mm" 

let mainItemList: Array<BagItem> = self.GetMainItemsInfoInBag() 
for(item) in mainItemList 
{ 
    let dateString = dateFormatter1.stringFromDate(item.date) + " " + item.time 
    // Send servey notification 
    let serveyNotificationTime = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.CalendarUnitHour, value: Int((120 + item.itemService.duration)/60), toDate: dateFormatter2.dateFromString(dateString)!, options: NSCalendarOptions.WrapComponents) 

    self.SetUpLocalNotification(serveyNotificationTime, message: "Do you want to join to the servey?": true) 

    // if time for now is earlier than reservation time - 1 based on hour, set reminder notification. 
    if(NSDate().dateByAddingTimeInterval(3*60*60).compare(NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.CalendarUnitHour, value: -1, toDate: dateFormatter2.dateFromString(dateString)!, options: NSCalendarOptions.WrapComponents)!) == NSComparisonResult.OrderedAscending) 
    { 
     let reminderNotificationTime = NSCalendar.currentCalendar().dateByAddingUnit(NSCalendarUnit.CalendarUnitHour, value: -1, toDate: dateFormatter2.dateFromString(dateString)!, options: NSCalendarOptions.WrapComponents) 
     self.SetUpLocalNotification(reminderNotificationTime, message: message, withCategory: false) 
    } 
} 

// Set Up Local Notifications 
private func SetUpLocalNotification(notificationTime: NSDate!, message: String!, withCategory: Bool!) 
{ 
    var app: UIApplication = UIApplication.sharedApplication() 
    var notifyAlarm: UILocalNotification! = UILocalNotification() 
    if(notifyAlarm != nil) 
    { 
     notifyAlarm.fireDate = notificationTime 
     notifyAlarm.timeZone = NSTimeZone.defaultTimeZone() 
     if(withCategory == true) 
     { 
      notifyAlarm.category = "FIRST_CATEGORY" 
     } 
     notifyAlarm.soundName = UILocalNotificationDefaultSoundName 
     notifyAlarm.alertBody = message 
     app.scheduleLocalNotification(notifyAlarm) 
    } 
} 

В приведенной выше коде, я пытаюсь настройки локальных уведомлений, как «напоминание» и «присоединиться» изыскательский. Однако я не могу правильно настроить время локального уведомления.

Спасибо за ваши ответы

С наилучшими пожеланиями

+0

вы должны показать остальную часть своего кода. SetUpLocalNotification() –

+0

Хорошо, теперь я показываю @LeonardoSavioDabus – saksut

+0

просто переместите свой notifyAlarm.fireDate = notificationTime вниз после строки timeZone –

ответ

0

Вы просто должны настроить ваш fireDate после настройки часовой пояс.

notifyAlarm.timeZone = NSTimeZone.localTimeZone() 
notifyAlarm.fireDate = notificationTime 

Также вы не должны сравнивать булевский var с истинным. Это избыточно

if withCategory { 
    notifyAlarm.category = "FIRST_CATEGORY" 
} 

Вам нужно будет удалить также .dateByAddingTimeInterval (3 * 60 * 60) из вашего кода.

+0

Когда я даю timeZone 'dateFormatter.timeZone = NSTimeZone (имя: "GMT")', как упоминалось выше, он устанавливает местное уведомление для дальнейшего. Какой формат я должен использовать? – saksut

+1

всегда использует localTime. Кстати, это значение по умолчанию. Он всегда будет хранить момент времени (GMT). поэтому, если вы находитесь в каком-то месте с смещением в 3 часа, он сохранит относительное время по Гринвичу. –

+0

Хорошо, я попробую «localTimeZone» и напишу вам еще раз. Спасибо – saksut