2016-05-25 1 views
1

J'ai créé un NSDate par dateFromComponents, en utilisant NSCalendar avec identifiant NSGregorianCalendar, voici la partie étrange: La date incorrecte se si elle est avant un certain moment avant 1900/12/31NSDate créé à partir de NSDateComponents est-il incorrect?

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents *components = [[NSDateComponents alloc] init]; 
components.year = 1900; components.month = 12; components.day = 31; 
NSDate *date = [calendar dateFromComponents:components]; 

components.year = 1901; components.month = 1; components.day = 1; 
NSDate *date2 = [calendar dateFromComponents:components]; 

NSLog(@"%@",calendar.timeZone.description); 
NSLog(@"%@",date); 
NSLog(@"%@",date2); 

Le journal sera :

2016-05-25 14:58:21.014 date[79754:2192157] Asia/Shanghai (GMT+8) offset 28800 
2016-05-25 14:58:21.015 date[79754:2192157] 1900-12-30 15:54:17 +0000 
2016-05-25 14:58:21.015 date[79754:2192157] 1900-12-31 16:00:00 +0000 

Comme vous pouvez le voir, il y a un écart de 5 minutes pendant la journée. Cependant, si je règle le timeZone par [NSTimeZone timeZoneForSecondsFromGMT:], même avec le même écart de secondes - 28800, ce sera normal. Quelle est la cause de ceci?

Répondre

1

Non, la date n'est pas incorrecte. Au lieu de cela, le code NSCalendar connaît des choses sur les calendriers dont vous ne rêveriez pas, comme les calendriers qui modifient leurs décalages horaires à un moment donné dans le passé.

Vous avez demandé au calendrier Asie/Shanghai de convertir deux dates, l'une le jour précédant le changement de fuseau horaire, l'autre le jour suivant le changement de fuseau horaire, et les deux heures sont correctement converties. Ce soir-là, tout le monde à Shanghai a dû ajuster ses montres.

+0

J'obtiens le même résultat exact si je définis le fuseau horaire en Asie/Shanghai. Belle prise. – Desdenova

-2

Essayez ceci !!

NSCalendar *calendar = [NSCalendar currentCalendar]; 

NSDateComponents *components = [[NSDateComponents alloc] init]; 

[components setYear:1987]; 
[components setMonth:3]; 
[components setDay:17]; 
[components setHour:14]; 
[components setMinute:20]; 
[components setSecond:0]; 

NSDate *date = [calendar dateFromComponents:components]; 

Hope this Aide :)

+0

puis-je demander pourquoi avez-vous voté? –

+0

Parce que votre réponse n'est pas pertinente. – Desdenova

+0

bro je pense que votre question crée NSdate des composants droit? –

1

question intéressante. Ce que vous voyez est les effets d'un changement de fuseau horaire du temps moyen local à l'heure normale de la Chine le 01-01-1901 quand les horloges ont été retournées 05m43s.

Plus de détails here.