iPhone - NSTimer - initWithFireDate и передать местное время - PullRequest
0 голосов
/ 29 августа 2011

В моем приложении я использую NSTimer и initWithFireDate.Я хочу запустить таймер через час.«Сейчас» означает местный часовой пояс.Всякий раз, когда я пытаюсь добавить надстройку на один час к нему и пытаюсь распечатать его, он печатает время в GMT, а не в соответствии с моим часовым поясом.Как я могу исправить эту ошибку?Я хочу NSDate через 1 час в зависимости от местного часового пояса.

Ответы [ 5 ]

2 голосов
/ 15 февраля 2013

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

- (NSDate *)currentLocalTime {
      NSDate *aTriggerDate = [NSDate date];

     NSTimeZone *aSourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
     NSTimeZone *aTriggerTimeZone = [NSTimeZone systemTimeZone];

     NSInteger aSourceGMTOffset = [aSourceTimeZone secondsFromGMTForDate:aTriggerDate];
     NSInteger aTriggerGMTOffset = [aTriggerTimeZone secondsFromGMTForDate:aTriggerDate];
     NSTimeInterval anInterval = aTriggerGMTOffset - aSourceGMTOffset;

     NSDate *aFinalDate = [[NSDate alloc] initWithTimeInterval:anInterval sinceDate:aTriggerDate];

    return aFinalDate;
}
1 голос
/ 29 августа 2011

NSDateFormatter * formater = [[NSDateFormatter alloc] init];formater.timeZone = [NSTimeZone localTimeZone];используйте это для локализации вашего часового пояса.

0 голосов
/ 08 октября 2015

Это моя версия кода Бикрамджита Сингха в Swift (работал только для меня, используя «UTC» в качестве аббревиатуры).Надеюсь, это поможет:

func testTimeZone(){

    let currentLocalTime = NSDate()

    let sourceTimeZone = NSTimeZone(abbreviation: "UTC")
    let triggerTimeZone = NSTimeZone.systemTimeZone()

    let sourceGTMOffset = sourceTimeZone?.secondsFromGMTForDate(currentLocalTime)
    let triggerGTMOffset = triggerTimeZone.secondsFromGMTForDate(currentLocalTime)

    let interval = triggerGTMOffset - sourceGTMOffset!

    let finalDate = NSDate(timeInterval: NSTimeInterval.init(interval), sinceDate: currentLocalTime)

    Swift.print("Current local time: \(currentLocalTime)")
    Swift.print("Source Time Zone (GTM): \(sourceTimeZone)")
    Swift.print("Trigger Time Zone (System Time Zone): \(triggerTimeZone)")
    Swift.print("Source GTM Offset: \(sourceGTMOffset)")
    Swift.print("Trigger GTM Offset: \(triggerGTMOffset)")
    Swift.print("Interval (Source - Trigger Offsets): \(interval)")
    Swift.print("Final Date (Current + interval): \(finalDate)")


}

ОБНОВЛЕНИЕ

Я действительно нашел более короткий способ получить дату, этот способ работал лучше для меня:

    var currentDate: NSDate {
    let currentLocalTime = NSDate()

    let localTimeZone = NSTimeZone.systemTimeZone()
    let secondsFromGTM = NSTimeInterval.init(localTimeZone.secondsFromGMT)
    let resultDate = NSDate(timeInterval: secondsFromGTM, sinceDate: currentLocalTime)

    return resultDate
}
0 голосов
/ 03 января 2012

Получив время, найдите часовой пояс и добавьте разницу во времени соответственно.

0 голосов
/ 29 августа 2011

Вы можете сделать это с NSDateFormatter, принимающим различные форматы строки даты.Просто попробуйте, вы получите ожидаемый ответ.

...