Frage

Ich versuche hier, einen Alarm einzustellen. Ich bin in Montréal, also in der EST Timezone. In dem von mir verwendeten Code erhalte ich das aktuelle Datum und versuche einige Minuten später zu läuten. Der Code funktioniert vollkommen in Ordnung, und der Alarm klingelt wie erwartet.

Hier ist das Problem: Es ist momentan 12.41 Uhr. Der Alarm klingelt um 12.43 Uhr. In meinem NSLog wird die Zeit jedoch gedruckt: Firedate: 2012-02-16 17:43:00 +0000

Es ist kein großes Problem, seit es funktioniert, aber eine Idee, warum es sich zu dieser Zeit zeigt und immer noch funktioniert? Irgendeine Idee, wie ich das beheben kann? Vielen Dank!

Ich habe die Zeitzone im Grunde überall gesetzt, hier ist der Code, den ich verwende:

-(void) Schedulenotification mit Interval: (int) minutenbevor {

// Current date
NSDate *now = [NSDate date];
// Specify which units we would like to use
unsigned units = NSTimeZoneCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSTimeZone* zone = [NSTimeZone timeZoneWithName:@"EST"];
[calendar setTimeZone:zone];
NSDateComponents *components = [calendar components:units fromDate:now];
[components setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];

NSInteger year = [components year];
NSInteger month = [components month];
NSInteger day = [components day];
NSInteger hour = [components hour];
NSInteger minute = [components minute];

NSDateComponents *dateComps = [[NSDateComponents alloc] init];
[dateComps setYear:year];
[dateComps setMonth:month];
[dateComps setDay:day];
[dateComps setHour:hour];
[dateComps setMinute:minute+2]; // Temporary
NSDate *itemDate = [calendar dateFromComponents:dateComps];

NSLog(@"fireDate : %@", itemDate);

UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif == nil)
    return;
localNotif.fireDate = itemDate;
//localNotif.timeZone = zone;
localNotif.timeZone = [NSTimeZone timeZoneWithName:@"EST"];

minutesBefore = 15; // Temporary
localNotif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"%@ in %i minutes.", nil),
                        @"Blabla", minutesBefore];
localNotif.alertAction = NSLocalizedString(@"See Foo", nil);

localNotif.soundName = UILocalNotificationDefaultSoundName;

NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"LastCall" forKey:@"lastcall"];
localNotif.userInfo = infoDict;

[[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; 

}

Vielen Dank!

War es hilfreich?

Lösung

Beachten Sie die +0000 am Ende dort? Das ist die Zeitzone. Es sagt dir, dass es um 17:43 GMT klingelte. Um Ihre Zeitzone festzulegen, müssen Sie "America/Montreal" (nicht EST) oder verwenden timeZoneWithAbbreviation: mit est. Der Datenträger ist zu jeder Zeit, die Sie festgelegt haben, und zum Zeitzone Ihres Kalenders konfiguriert. Deshalb ist das Datum korrekt, nur nicht zur richtigen Zeitzone angezeigt. Um zu ändern, dass Sie eine verwenden müssen NSDateFormatter. Sehen Sie sich das Beispiel unten an, wie!

 NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSTimeZone* zone = [NSTimeZone timeZoneWithAbbreviation:@"EST"];
[calendar setTimeZone:zone];

NSDateComponents *dateComps = [[NSDateComponents alloc] init];
[dateComps setHour:16];
[dateComps setYear:2001];
[dateComps setMinute:30];
NSDate *itemDate = [calendar dateFromComponents:dateComps];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeStyle:NSDateFormatterFullStyle];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];

NSLog(@"fireDate : %@", [formatter stringFromDate:itemDate]);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top