2011-12-02 3 views
5

J'utilise UIDatePicker dans mon application et quand je prends la date qui a été choisie avec:UIDatePicker retour mal NSDate

NSDate *date = picker.date; 

picker.date retourné le jour avant la date que j'ai choisi.

une idée pourquoi cela arrive?

+0

Utilisez-vous un UIImagePicker (comme dans votre question) ou un UIDatePicker (comme dans le titre de votre question)? Personnalisez-vous le sélecteur de date de quelque manière que ce soit? –

+0

mon erreur, j'utilise UIDatePicker – MTA

Répondre

8

UIDatePicker sera l'affichage des dates et des heures dans votre fuseau horaire local. Cependant, NSDate n'a pas de concept de fuseau horaire car il stocke un nombre absolu de secondes depuis une date de référence. Quand NSLogging une date, il montre la date et l'heure en GMT. Je m'attends à ce que si vous travaillez sur votre différence de fuseau horaire local de GMT, vous verrez que c'est la bonne date. Essayez de créer un NSDateFormatter ou un NSCalendar avec les paramètres régionaux appropriés et transmettez la date par le biais de ce paramètre.

Pour plus d'informations sur ce sujet commun, voir this site written by another SO contributor.

+0

je choisis de donner à l'utilisateur uniquement pour choisir la date sans temps – MTA

+2

Il n'y a pas de NSDate sans temps. Vous ne l'affichez pas. La réponse est toujours la même. – jrturton

+0

même problème ici. corrigé en ajoutant 'setTimeZone:' & 'setLocale:' à mon UIDatePicker. – HelmiB

1

Avez-vous vérifié le fuseau horaire?

Lorsque vous imprimez un NSDate, il utilisera GMT comme fuseau horaire.

Si vous définissez le fuseau horaire du système sur NSDateFormatter, vous pouvez obtenir une autre date, car elle prendra le fuseau horaire et calculera l'heure en conséquence.

Ajouter ce code et voir si la sortie est correcte:

NSDate *date = picker.date; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeZone:NSDateFormatterNoStyle]; 
[dateFormatter setLocale:[NSLocale currentLocale]]; 
NSLog(@"Date: %@", [dateFormmater stringFromDate:date]); 
[dateFormatter release], dateFormatter = nil; 
+0

alors comment puis-je obtenir seulement la date qui a été choisie par l'utilisateur – MTA

+0

Vous avez la date que l'utilisateur sélectionne, mais vous n'avez pas le fuseau horaire. le timeszone utilisé est celui du système actuel. – rckoenes

5

donner cette solution a fonctionné pour moi

 NSDate* sourceDate = [NSDate date]; 

     NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
     NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; 

     NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate]; 
     NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate]; 
     NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset; 

     NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease]; 

// je suis sortie moi dans une étiquette que vous pouvez utiliser tout ce que vous aimez

 NSString *dateOutput = [[[NSString alloc] initWithFormat:@"%@", destinationDate]autorelease]; 
     self.dateLabel.text = dateOutput; 
2

N'oubliez pas de créer le NSDate puis le sortir avec un fuseau horaire et un calendrier valides! NSDate ne représente qu'un point absolu dans le temps. Il n'a pas de notion de fuseau horaire (NY, Barcelone, ...) ou de calendrier (grégorien, hébreu, ...).

UIDatePicker revient par défaut d'un NSDate avec le système NSCalendar et NSTimeZone, mais lorsque vous essayez d'imprimer plus tard, vous ne formatez pas la sortie. Vous pouvez avoir la discordance.

Donc, vous devez d'abord configurer UIDatePicker correctement et ensuite transformer la sortie avec le NSDateFormatter pour qu'il connaisse le calendrier et le fuseau horaire utilisé.

Un exemple de code avec l'initialisation du UIDatePicker puis imprimer le résultat:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // init the UIDatePicker with your values 
    // by default UIDatePicker inits with today, system calendar and timezone 
    // Only for teaching purposes I will init with default values 
    NSDate * now = [[NSDate alloc] init]; 
    [_datePicker setDate: now] 
       animated: YES];  

    _datePicker.timeZone = [NSTimeZone localTimeZone]; 
    _datePicker.calendar = [NSCalendar currentCalendar]; 

    [_datePicker addTarget: self 
        action: @selector(getDatePickerSelection:) 
     forControlEvents:UIControlEventValueChanged]; 

} 


-(void)getDatePickerSelection:(id) sender 
{ 

    // NSDateFormatter automatically inits with system calendar and timezone 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    // Setup an output style 
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

    // Medium style date, short style time => "Nov 23, 1937 3:30pm" 
    NSString *dateString = [dateFormatter stringFromDate:date]; 

} 

Vérifiez la réponse que je l'ai fait pour une autre question similaire:

NSDate output using NSDateFormatter

1

Il suffit d'ajouter une ligne de code

self.datePicker.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; 

0 est pour GMT 00. Ajoutez selon votre fuseau horaire.