Question

J'ai développé une application qui fonctionne beaucoup avec les dates et aussi les magasins de ces chaînes de caractères dans la base de données à l'aide de cette méthode:

- (NSDate*) stringToDate{
   NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
   [dateFormat setDateFormat:@"yy-MM-dd HH:mm"];
   NSDate *date = [dateFormat dateFromString:self];

   return date;

}

De travail avec la date/heure est assez difficile - il suffit à lui seul la différence de temps entre le système et les paramètres régionaux de temps de toute façon la méthode ci-dessus devrait prendre soin de cela.(J'espère donc que, depuis le formatage d'un NSDate à un NSString retourne l'heure locale correcte au lieu de regarder les NSDate variable dans le débogueur qui montre un 2 heures de différence dans mon cas)

Il y a également de nombreux calculs comme ceci:

    NSCalendar *calendar = [NSCalendar currentCalendar];   <------

    NSDateComponents *components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit |NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:someDate];

    NSInteger now_hour = [components hour];
    NSInteger now_minute = [components minute];
    NSInteger yearx =  [components year];
    NSInteger monthx =  [components month];
    NSInteger dayx =  [components day];

là où j'ai besoin de régler/modifier/créer un certain nombre de dates/heures, faire les calculs et les récupérer ou les enregistrer dans la base de données à nouveau comme NSStrings.

Ma question est sur l'utilisation du calendrier approprié.

Dois-je toujours écrire:

NSCalendar *calendar = [NSCalendar currentCalendar]; ?

ou

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

et

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

esp.selon que l'application est utilisée en Europe/états-unis vs Chine?

Était-ce utile?

La solution

Votre méthode stringToDate n'allez pas exactement de travail, voir QA1480.Version courte:l' NSDateFormatter malheureusement a deux, un peu contradictoire, les rôles — le décodage et l'encodage de texte spécifique de formats et de convertir les dates pour l'affichage.Parce que celui-ci est locale liée, c'est la valeur par défaut.Pour vous assurer d'obtenir l'ancien comportement, vous devez définir explicitement le en_US_POSIX locale, qui est garanti exactement à l'honneur de votre chaîne de date.

Cela étant dit, vous semblez être un peu confus au sujet de ce qu'est un NSDate est.Ce n'est pas une NSString ou toute autre représentation d'une date.C'est un résumé d'enregistrement d'un instant précis.C'est donc sans aucun rapport avec le calendrier actuel.Le calendrier de l'utilisateur et les paramètres régionaux affectent la façon dont les dates sont imprimés, mais cela n'affecte pas les dates elles-mêmes.Maintenant, c'est toujours maintenant, cependant vous l'écrivez.C'est pourquoi, lorsque vous appliquez un module de formatage d'une date que vous obtenez une bonne date, mais si vous entrez une date pour la console, puis vous obtenez quelque chose d'abstrait, et pas nécessairement dans votre fuseau horaire local. NSDate a pas de notion de temps, des zones ou des différents calendriers.

Base de Données peut stocker des dates directement (c'est à dire, il n'y a pas besoin que ce soit pour vous convertir à une de chaînes manuellement, pas plus qu'il ne l'est pour les valeurs numériques) donc je ne suis pas entièrement sûr de ce que vous obtenez en.Mais le comportement normal est d'utiliser currentCalendar lorsque vous souhaitez afficher quelque chose pour l'utilisateur.Qui va s'afficher en fonction de leur zone de temps et d'autres paramètres.

Comme pour l'assurance de la qualité, pour l'application de date fixe, cordes, vous devriez utiliser une date de formateur avec une de définir explicitement des paramètres régionaux et de ne pas penser à l'agenda.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top