UilocalNotification & nstimezone, falsche Zeitzone auftauchen
-
26-10-2019 - |
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!
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]);