Merci Ole. J'ai enfin compris que NSDate
et NSDateformatter
ne sont que des concepts abstraits et qu'une "date" est vraiment enregistrée en "millisecondes ou secondes depuis 1/1 2001" en interne.
J'ai fait un "Proof of concept" pour vraiment le comprendre. Maintenant, il est soudainement très simple d'écrire des catégories sur NSDate
pour s'assurer que les dates entrées et sorties sont correctement formatées, mais tous les calculs sont faits à la date UTC brute.
- (void) testGMTDateParser {
NSMutableArray *arrayDates = [NSMutableArray arrayWithCapacity:5];
[self setParsedDates:arrayDates];
NSMutableArray *arrayGMTOffsets = [NSMutableArray arrayWithCapacity:5];
[self setParsedGMTOffsets:arrayGMTOffsets];
NSString *date00 = @"2010-03-30T12:00:00";
NSString *GMT00 = @"-2";
NSString *date01 = @"2010-03-30T12:00:00";
NSString *GMT01 = @"-1";
NSString *date02 = @"2010-03-30T12:00:00";
NSString *GMT02 = @"+0";
NSString *date03 = @"2010-03-30T12:00:00";
NSString *GMT03 = @"+1";
NSString *date04 = @"2010-03-30T12:00:00";
NSString *GMT04 = @"+2";
NSArray *dateArray = [NSArray arrayWithObjects:date00, date01, date02, date03, date04,nil];
NSArray *GMTArray = [NSArray arrayWithObjects:GMT00, GMT01, GMT02, GMT03, GMT04, nil];
for (int i = 0; i < [dateArray count]; i++) {
[self parseDateString:[dateArray objectAtIndex:i] withGMTString:[GMTArray objectAtIndex:i]];
}
}
Analyser les dates en fonction de leur décalage GMT respectif. Cela s'assurera que l'heure UTC enregistrée en interne est correcte.
-(void) parseDateString:(NSString*) dateString withGMTString:(NSString*) GMTString {
NSInteger hoursFromGMT = [GMTString intValue];
NSInteger secondsFromGMT = (hoursFromGMT * 60 * 60);
NSTimeZone *timeZone = [NSTimeZone timeZoneForSecondsFromGMT:secondsFromGMT];
NSDateFormatter *dateFormatterGMTAware = [[NSDateFormatter alloc] init];
[dateFormatterGMTAware setTimeZone:timeZone];
[dateFormatterGMTAware setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
NSDate *date = [dateFormatterGMTAware dateFromString:dateString];
[dateFormatterGMTAware release];
[self.parsedDates addObject:date];
[self.parsedGMTOffsets addObject:[NSNumber numberWithInt:secondsFromGMT]];
}
Configurez le format NSDate pour imprimer les dates enregistrées en ce qui concerne le décalage GMT. toutes les dates peuvent maintenant être manipulées comme UTC sans égard à GMT.
-(void) printOutDates {
for (int i = 0; i < [self.parsedDates count]; i++) {
NSTimeZone *timeZone = [NSTimeZone timeZoneForSecondsFromGMT:[[parsedGMTOffsets objectAtIndex:i] intValue]];
NSDateFormatter *dateFormatterGMTAware = [[NSDateFormatter alloc] init];
[dateFormatterGMTAware setTimeZone:timeZone];
[dateFormatterGMTAware setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSLog(@"%@ in Original GMT", [dateFormatterGMTAware stringFromDate:[parsedDates objectAtIndex:i]]);
NSLog(@"%@ in Local GMT\n\n", [parsedDates objectAtIndex:i]);
}
}
2010-03-30 18: 50: 31,284 TimeZonePOC [39830: 207] 2010-03-30 12:00:00 -0200 Titre original GMT 2010-03-30 18: 50: 31.285 TimeZonePOC [39830: 207] 2010-03-30 16:00:00 +0200 en local GMT
2010-03-30 18:50:31.287 TimeZonePOC [39830: 207] 2010-03-30 12:00:00 -0100 dans Original GMT 2010-03-30 18: 50: 31.287 TimeZonePOC [39830: 207] 2010-03-30 15:00:00 + 0200 en local GMT
2010-03-30 18: 50: 31,289 TimeZonePOC [39830: 207] 2010-03-30 12:00:00 +0000 Titre original GMT 2010-03-30 18:50 : 31,289 TimeZonePOC [39830: 207] 2010-03-30 14:00:00 +0200 en local GMT
2010-03-30 18: 50: 31,290 TimeZonePOC [39830: 207] 2010-03-30 12:00:00 +0100 en GMT d'origine 2010-03-30 18: 50: 31.292 TimeZonePOC [39830: 207] 2010-03-30 13:00:00 +0200 en GMT local
2010-03-30 18: 50: 31,292 TimeZonePOC [39830: 207] 2010-03-30 12:00:00 GMT 0200 Titre original 2010-03-30 18: 50: 31,294 TimeZonePOC [39830 : 207] 2010-03-30 12:00:00 +0200 en local GMT
Bonjour Ole Merci pour l'entrée. Comment utiliser setTimeZone? Comme je peux le voir à partir des docs, il est possible de définir un timeZone sur un formateur (par secondesFromGMT dans mon cas) Ensuite, je dois formater mon format de date pour chaque date Im affichage? La date est toujours enregistrée en tant qu'heure locale et tous les calculs que j'effectue entre ces dates impliqueraient la variable GMT et réduiraient tout au format UTC avant toute manipulation de date. J'imagine qu'écrire une catégorie sur NSDate et faire les calculs à la main en fonction du décalage GMT que je dois sauvegarder serait plus facile. Ou avez-vous raté ce à quoi vous faisiez référence? – RickiG
Non, vous vous êtes trompé. NSDate ne connaît pas les fuseaux horaires, il stocke toujours les dates d'une manière indépendante du fuseau horaire (comme une période de temps depuis une date de référence spécifique). Donc, vos calculs ne seraient pas affectés. Maintenant, chaque fois que vous devez analyser une date ou en afficher une, vous devez configurer un NSDateFormatter et définir son fuseau horaire sur le bon fuseau horaire (par exemple, le fuseau horaire dans lequel la date doit être analysée ou la date affichée). –