NSDate décaler de -2 heures

kOrt3xkOrt3x Membre
21:40 modifié dans API UIKit #1
Bonsoir,

Je rencontre un problème avec un NSDate qui est décalé de -2 heures et j'ai testé avec un NSLog.

Voici le résultat de la console :


2011-10-09 01:49:25.850 xxxx[9288:707] Date Now = 2011-10-08 23:49:25 +0000
2011-10-09 01:49:25.855 xxxx[9288:707] dateSelected = 2011-10-08 23:49:25 +0000

Et le code :


NSDate *now = [NSDate date];<br />datePicker.minimumDate = now;<br />[datePicker setDate:now animated:YES];<br />[super viewDidLoad];<br />NSDate *dateSelected = [datePicker date]; // récupere la date choisi dans le picker<br />NSLog(@&quot;Date Now = %@&quot;, now);<br />NSLog(@&quot;dateSelected = %@&quot;, dateSelected);


Je précise que c'est sous Xcode 4.2 GM et iOS 5 GM.

Par avance, merci.

Réponses

  • CéroceCéroce Membre, Modérateur
    21:40 modifié #2
    Fuseau horaire.
    Voir ici.
  • AliGatorAliGator Membre, Modérateur
    21:40 modifié #3
    Je vois pas de problème de décalage moi. 21h00 +0000 (GMT) et 23h heure de Paris (+0200 soit GMT+2) c'est le même moment dans le temps, la même heure, donc quel est le problème ?

    Si tu n'es pas habitué à  gerer les fuseaux horaires et autres manipulation de base sur les dates il faut commencer par lire le "Date and Time Programming Guide" dans la doc Apple.
  • kOrt3xkOrt3x Membre
    21:40 modifié #4
    Le problème est que quand je récupère la date et heure de mon DatePicker, je ne retrouve pas la date et heure choisi, mais cette date/heure -2 heures.
    Pourtant ça fonctionner très bien avant, alors comment faire pour avoir la date et l'heure choisi dans le DatePicker ?
  • AliGatorAliGator Membre, Modérateur
    21:40 modifié #5
    En lisant la doc sus-mentionnée.
  • kOrt3xkOrt3x Membre
    21:40 modifié #6
    Bon, voici ce que j'ai fais, mais c'est toujours pareil :

    <br />&nbsp; &nbsp; // String From Date<br />&nbsp; &nbsp; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];<br />&nbsp; &nbsp; [dateFormatter setTimeStyle:NSDateFormatterFullStyle];<br />&nbsp; &nbsp; [dateFormatter setDateStyle:NSDateFormatterFullStyle];<br />&nbsp; &nbsp; [dateFormatter setLocale:[NSLocale currentLocale]];<br />&nbsp; &nbsp; [dateFormatter setDateFormat:@&quot;yyyy-MM-dd HH:mm:ss ZZZ&quot;];<br />&nbsp; &nbsp; NSDate *dateSelected = [datePicker date];<br />&nbsp; &nbsp; NSString *dateChoisie = [dateFormatter stringFromDate:dateSelected];<br />&nbsp; &nbsp; NSDate *dateFinal = [dateFormatter dateFromString:dateChoisie];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSLog(@&quot;dateSelected = %@&quot;, dateSelected);<br />&nbsp; &nbsp; NSLog(@&quot;dateChoisie = %@&quot;, dateChoisie);<br />&nbsp; &nbsp; NSLog(@&quot;dateFinal = %@&quot;, dateFinal);<br /><br />
    


    2011-10-15 00:29:57.010 Event[25522:707] dateSelected = 2011-10-14 22:30:50 +0000
    2011-10-15 00:29:57.012 Event[25522:707] dateChoisie = 2011-10-15 00:30:50 +0200
    2011-10-15 00:29:57.018 Event[25522:707] dateFinal = 2011-10-14 22:30:50 +0000


    Que faire ?
  • AliGatorAliGator Membre, Modérateur
    octobre 2011 modifié #7
    dans 1318631710:

    Que faire ?
    Heu bah rien, je vois pas ce qui te gêne ?
    Tu récupères bien la même date et heure dans les 3 cas donc ça marche très bien.

    Quand tu NSLog une NSDate comme quand tu NSLog n'importe quel NSObject ça appelle sa méthode description et il se trouve que la description de NSDate affiche sa représentation en timezone GMT, et alors ? Ca pose pas de pb, c'est qu'une représentation parmi d'autres d'une NSDate, mais ça reste le même objet.
    C'est comme le nombre 5 ou 5.0 ou 5.00 c'est le même nombre, et "rouge" ou "#FF0000" ou rgb(255,0,0), c'est pareil, je vois pas le souci.
  • kOrt3xkOrt3x Membre
    21:40 modifié #8
    D'accord, mais quand je récupère la date et l'heure de mon DatePicker, je récupère pas la bonne heure et comme ensuite pour l'enregistre l'événement dans le calendrier, les date start et end ne s'enregistre pas.

    Voici mon code :

    <br />NSString *titreEvent = monEvent.text;<br />&nbsp; &nbsp; NSError *error;<br />&nbsp; &nbsp; EKEventStore *eventStore = [[EKEventStore alloc] init];<br />&nbsp; &nbsp; EKEvent *myEvent&nbsp; = [EKEvent eventWithEventStore:eventStore];<br />&nbsp; &nbsp; EKCalendar *Calendar = [eventStore defaultCalendarForNewEvents];&nbsp; // calendar par defaut<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // String From Date<br />&nbsp; &nbsp; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];<br />&nbsp; &nbsp; [dateFormatter setTimeStyle:NSDateFormatterFullStyle];<br />&nbsp; &nbsp; [dateFormatter setDateStyle:NSDateFormatterFullStyle];<br />&nbsp; &nbsp; [dateFormatter setLocale:[NSLocale currentLocale]];<br />&nbsp; &nbsp; [dateFormatter setDateFormat:@&quot;yyyy-MM-dd HH:mm:ss ZZZ&quot;];<br />&nbsp; &nbsp; NSDate *dateSelected = [datePicker date];<br />&nbsp; &nbsp; NSString *dateChoisie = [dateFormatter stringFromDate:dateSelected];<br />&nbsp; &nbsp; NSDate *dateFinal = [dateFormatter dateFromString:dateChoisie];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSLog(@&quot;dateSelected = %@&quot;, dateSelected);<br />&nbsp; &nbsp; NSLog(@&quot;dateChoisie = %@&quot;, dateChoisie);<br />&nbsp; &nbsp; NSLog(@&quot;dateFinal = %@&quot;, dateFinal);<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; myEvent.title&nbsp; &nbsp;  = titreEvent;<br />&nbsp; &nbsp; myEvent.startDate = dateFinal;<br />&nbsp; &nbsp; myEvent.endDate&nbsp;  = dateFinal;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // TODO Switch Allday<br />&nbsp; &nbsp; if (monSwitchAllday.isOn){<br />&nbsp; &nbsp; &nbsp; &nbsp; myEvent.allDay = YES;<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; myEvent.calendar = Calendar;<br />&nbsp; &nbsp; myEvent.notes = titreEvent;<br />&nbsp; &nbsp; myEvent.availability = EKEventAvailabilityUnavailable;<br />&nbsp; &nbsp; //myEvent.timeZone = [NSTimeZone systemTimeZone];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; // Ajout de l&#039;alarm<br />&nbsp; &nbsp; if ( monSwitchAlarm.isOn ){<br />&nbsp; &nbsp; &nbsp; &nbsp; NSMutableArray *myAlarmsArray = [[NSMutableArray alloc] init];<br />&nbsp; &nbsp; &nbsp; &nbsp; EKAlarm *alarm = [EKAlarm alarmWithRelativeOffset:0]; // On Date<br />&nbsp; &nbsp; &nbsp; &nbsp; [myAlarmsArray addObject:alarm];<br />&nbsp; &nbsp; &nbsp; &nbsp; myEvent.alarms = myAlarmsArray;<br />&nbsp; &nbsp; &nbsp; &nbsp; //NSLog(@&quot;Alarme ON&quot;);<br />&nbsp; &nbsp; }else{<br />&nbsp; &nbsp; &nbsp; &nbsp; //NSLog(@&quot;Alarme OFF&quot;);<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; //Ajoute de l&#039;evenement<br />&nbsp; &nbsp; if ( ![monEvent.text isEqualToString:@&quot;&quot;]){<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; [eventStore saveEvent:myEvent span:EKSpanThisEvent error:&amp;error];<br />&nbsp; &nbsp; &nbsp; &nbsp; UIAlertView *monAlert = [[UIAlertView alloc]initWithTitle:@&quot;Quick Event&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; message:NSLocalizedString(@&quot;messageOK&quot;,@&quot;Votre événement a été ajouté.&quot;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  delegate:self <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cancelButtonTitle:@&quot;Ok&quot; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; otherButtonTitles:nil];<br />&nbsp; &nbsp; &nbsp; &nbsp; [monAlert show];<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; // remise à  zéro<br />&nbsp; &nbsp; &nbsp; &nbsp; monEvent.text = @&quot;&quot;;<br />&nbsp; &nbsp; &nbsp; &nbsp; monEvent.delegate = self;<br />&nbsp; &nbsp; &nbsp; &nbsp; NSLog(@&quot;myevent = %@&quot;, myEvent);<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; }<br />
    



    2011-10-15 10:47:13.288 QuickEvent[34525:207] myevent = EKEvent <0x535dca0> {EKEvent <0x535dca0> {title = test; calendar = EKCalendar <0x5332ce0> {title = Calendar; type = Local; account = (null); allowsModify = YES; color = (null)}; alarms = (
        "EKAlarm <0x53517f0> {triggerInterval = 0.000000}"
    ); URL = (null); lastModified = 2011-10-15 08:47:13 +0000}; location = (null); startDate = 2011-10-15 08:46:22 +0000; endDate = 2011-10-15 08:46:22 +0000; allDay = 0; floating = 0; recurrence = (null); attendees = (null)}
  • AliGatorAliGator Membre, Modérateur
    21:40 modifié #9
    dans 1318668457:

    D'accord, mais quand je récupère la date et l'heure de mon DatePicker, je récupère pas la bonne heure
    Comment ça ? De ce que je vois de tes logs, tu récupères tout à  fait la bonne heure.

    Si par exemple dans ton DatePicker tu choisis le 15/10/2011 à  14:00, et que ton iPhone est configuré correctement (c'est à  dire que si tu es à  Paris, ton iPhone est configuré pour être dans le fuseau horaire de Paris, bien sûr, comme tout le monde), ta NSDate récupérée doit valoir cette date " sans doute représentée sous la forme "2011-10-15 12:00:00 +0000" si tu la log avec NSLog mais bon c'est pareil "
    dans 1318668457:
    et comme ensuite pour l'enregistre l'événement dans le calendrier, les date start et end ne s'enregistre pas.
    Je vois pas trop le rapport entre le fait que tu penses ne pas recevoir la bonne date (alors que pourtant c'est le cas pour moi mais bon) et le fait que le EKEvent ne s'enregistre pas ? Même si ta NSDate était décalée de 2h comme tu le crois, je vois pas en quoi ça empêcherai le EKEvent à  s'enregistrer dans ton calendrier...
  • kOrt3xkOrt3x Membre
    21:40 modifié #10
    Effectivement, il devrait enregistre l'évenement même si dans mon datepicker, je lui indique une date futur (3-4heures par rapport) alors que là  c'est pas le cas, il n'enregistre pas la date.

    Par contre, quand j'indique d'enregistrer l'événement avec myEvent.allDay = YES; là  l'enregistrement se fait bien.

    Je pense donc que le problème vient de l'enregistrement.
  • AliGatorAliGator Membre, Modérateur
    21:40 modifié #11
    Bah en mm temps si c'est un event qui n'est pas allDay mais dont la date et heure de début est exactement la même que la date et heure de fin, c'est sans doute normal...

    (Et tout ça avec la bonne heure sans aucun décalage de 2h car il n'y en a jamais eu)
  • kOrt3xkOrt3x Membre
    21:40 modifié #12
    Oui, je viens de trouver pourquoi, car le endDate ne doit pas être identique à  la startDate.
    J'ai donc mis ça :


    <br />myEvent.endDate&nbsp;  =&nbsp; [dateSelected dateByAddingTimeInterval:30*60];<br />
    


    Et c'est good.

    Alors merci à  toi et aux autres, car j'aurai au moins appris par mal de chose.

    Merci. <3 :p
Connectez-vous ou Inscrivez-vous pour répondre.