iPhone - NSTimer - initWithFireDate并传递当地时间

时间:2011-08-29 08:40:54

标签: iphone nstimer

在我的应用中,我使用的是NSTimer并使用了initWithFireDate。 我想从现在开始一小时后开火。 "现在"指当地时区。 当我试图让添加添加一小时并尝试打印时,它会以GMT打印时间而不是根据我的时区。 我该如何解决这个错误? 我希望NSDate从现在起1小时,具体取决于当地时区。

5 个答案:

答案 0 :(得分:2)

此代码可以帮助您获取当地时间,并可以从那里开始相应地进行:

- (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 :(得分:1)

NSDateFormatter * formater = [[NSDateFormatter alloc] init]; formater.timeZone = [NSTimeZone localTimeZone]; 用它来定位你的时区。

答案 2 :(得分:0)

你可以使用NSDateFormatter获取日期字符串的不同格式。试试吧,你会得到你期望的答案。

答案 3 :(得分:0)

在抽出时间后,找到时区并相应地添加时差。

答案 4 :(得分:0)

这是我在Swift中的Bikramjit Singh代码版本(仅使用“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
}