2013-08-21 2 views
-2

Je stocke des valeurs au format GMT sur un serveur. je les télécharger sur l'appareil et le convertir aux utilisateurs heure locale via la fonction suivante:NSDateFormatter renvoie le 1er janvier 2001 comme date

- (void)convertTimeZone 
{ 
    //Converts the match timing from GMT to the users local time 
    NSString *serverDateString = [NSString stringWithFormat:@"%@-%@-%@ %@:%@ GMT", year, month, day, hour, min]; 

    NSDateFormatter *dateFormatter = [NSDateFormatter new]; 
    dateFormatter.dateFormat  = @"yyyy-MM-dd HH:mm zzz"; 

    NSDate *serverDate    = [dateFormatter dateFromString:serverDateString]; 

    NSString *localDateString  = [dateFormatter stringFromDate:serverDate]; 
    NSDate *localDate    = [dateFormatter dateFromString:localDateString]; 


    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSHourCalendarUnit |NSMinuteCalendarUnit |NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:localDate]; 

    min = [NSString stringWithFormat:@"%d",[components minute]]; 
    hour = [NSString stringWithFormat:@"%d",[components hour]]; 
    day = [NSString stringWithFormat:@"%d",[components day]]; 
    month = [NSString stringWithFormat:@"%d",[components month]]; 
    year = [NSString stringWithFormat:@"%d",[components year]]; 

} 

Presque tout le monde obtient le bon moment après la conversion. Cependant peu d'utilisateurs ont écrit pour indiquer que la date qu'ils reçoivent est le 1er janvier 2001, qui est la date d'initialisation sur iOS et OSX. Et la date est le décalage horaire entre GMT et leur date locale.

Les valeurs année, mois, jour, heure et min sont correctement définies et reçues par le serveur. Je le sais parce que certaines des autres valeurs sont affichées correctement.

Toutefois, ce processus de conversion date-heure ne fonctionne pas correctement dans certains cas.

Pourquoi cela se produit-il?

Puisqu'il n'est jamais arrivé sur mon appareil mais est arrivé à des utilisateurs dans d'autres pays, je ne sais pas comment le reproduire. Ils ont essayé de le redémarrer mais ils ont toujours la mauvaise date. Merci.

+0

Sans voir vos entrées et sorties, il est impossible de localiser tous les endroits où vous pourriez avoir foiré. (BTW, -1 pour déclarer un "bogue iOS" lorsque les probabilités sont infimes) –

+0

Votre code n'a absolument aucun sens - vous convertissez une chaîne en NSDate, la convertissez en chaîne, puis vous la convertissez en NSDate, tous avec le même formateur de date, et sans aucun changement à la configuration du formateur de date. Qu'espères-tu changer? –

+0

(Et comment vous attendez-vous à ce que ci-dessus pour convertir de GMT à l'heure locale?) –

Répondre

1

Chaque fois que vous utilisez un NSDateFormatter pour lire ou émettre des dates qui ont besoin d'être dans un certain format spécifique, vous aurez envie de faire quelque chose comme ceci:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 

Cela permettra d'éviter le problème montré par exemple here.

+0

Alors, ça va marcher partout ? Mon application n'est pas seulement centrée sur les Etats-Unis, donc de cette façon tous pourront l'utiliser? Merci –

+0

Oui, cela fonctionnera partout, et la configuration manuelle des paramètres régionaux n'interférera pas avec la localisation de votre application. est séparé du fuseau horaire, il est nécessaire de le configurer manuellement pour s'assurer que les appareils de vos utilisateurs se comportent comme prévu, quels que soient leurs paramètres de langue ou de région. – bdesham

1

Vous ne parvenez pas à définir les paramètres régionaux, comme requis par QA1480. Par conséquent, le format de date que vous avez défini peut être modifié selon les paramètres de l'utilisateur.

Définissez explicitement les paramètres régionaux pour résoudre le problème.

Questions connexes