J'ai un nstring (ex. "2011-04-12 19:23:39"), et ce que j'ai fait pour le formater à un NSDate était le suivant: mais Ce qu'il génère quand je nslog la date est la suivante: p> 2011-04-12 23:23:39 +0000 p> qui est d'environ 4 heures de congé. Y a-t-il quelque chose que j'ai manqué? Éventuellement un problème de fuseau horaire? P> p>
5 Réponses :
Votre formateur de données et de date omettez le spécificateur de fuseau horaire. Alors quelque chose comme ceci: fonctionnerait - le z est le spécificateur de fuseau horaire et analysera les décalages numériques et les codes TimeZone. Bien que dans votre cas, votre date d'entrée n'a aucune information de fuseau horaire, cela ne fonctionnera pas. p> Votre chaîne temporelle correcte devrait être comme "2011-04-12 19:23:39 -0400" ou "2011-04-12 19:23:39 est" p> Selon Sur l'endroit où vous obtenez votre date à partir de votre date, vous devez résoudre ce problème pour produire une date parfaitement qualifiée si vous ne pouvez pas faire cela, vous devrez accepter TimeZone Compossations avec le serveur ou simplement «Code HARD» un fuselage de fuseau horaire et ajoutez ce nombre de secondes à votre nsdate. p> p>
La date est enregistrée comme une date UTC peut être vue par le +0000 code> à la fin. Le format de date que vous utilisez pour analyser la chaîne suppose votre fuseau horaire local qui est probablement 4 heures derrière l'UTC avec des économies de lumière du jour et la norme -5 heures. P>
La réponse en bref, la date est renvoyée GMT, sauf indication contraire. Vous pouvez définir votre fuseau horaire pour obtenir la date correcte. Si vous envisagez d'utiliser la date de l'application pour définir quoi que ce soit (tel que le temps localNotification ou l'événement), vous devez faire quelque chose de spécial à la date, car si vous définissez la date dans l'iphone, elle sera définie comme heure GMT et sera éteinte. de quelques heures. (Dans votre cas 4 heures). Je fais cette chose exacte que je viens de décrire dans l'une de mes applications.
J'ai fait un gâchis d'essayer de faire fonctionner cela correctement sans que les heures soient désactivées. C'était un énorme pita pour comprendre mais sa fonctionne maintenant. J'ai copié, collé et édité mon code à partager. Encore une fois, c'est désordonné mais ça marche! Le pickerchanged obtient ses informations à partir d'un UidatePicker P>
Le code est ci-dessous. P> - (void)pickerChanged:(id)sender
{
NSLog(@"value: %@",[sender date]);
NSDate* date= [sender date];
NSDateFormatter *formatter=[[[NSDateFormatter alloc]init]autorelease];
[formatter setDateFormat:@"MM/dd/yyyy hh:mm:ss a"];
[formatter setTimeZone:[NSTimeZone systemTimeZone]];
[formatter setTimeStyle:NSDateFormatterLongStyle];
NSString *dateSelected =[formatter stringFromDate:date];
NSString *timeZone = [dateSelected substringFromIndex:12];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
//here we have to get the time difference between GMT and the current users Date (its in seconds)
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:date];
//need to reverse offset so its correct when we put it in the calendar
correctedTimeForCalendarEvent = destinationGMTOffset + (2*(-1*destinationGMTOffset));
//date to enter into calendar (we will use the correctedTimeForCalendarEvent to correct the time otherwise it will be off by a few hours )
NSDate * destinationDate = [[[NSDate alloc] initWithTimeInterval:destinationGMTOffset sinceDate:date] autorelease];
NSDate * dateForReminder = destinationDate;
// return destinationDate;
NSLog(@"value: %@ - %@",destinationDate,dateForReminder);
//DO NOT put this code in this same function this is for a quick example only on StackOverflow
//otherwise you will have reminders set everytime the users scrolled to a different time
//set event reminder
//make sure to import EventKit framework
EKEventStore *eventDB = [[[EKEventStore alloc] init]autorelease];
EKEvent *myEvent = [EKEvent eventWithEventStore:eventDB];
NSString * eventTitle = [NSString stringWithFormat:@"%@ - %@",app.dealerBusinessName,serviceOrComments.text];
myEvent.title = eventTitle;
//double check date one more time
NSLog(@"value: %@",destinationDate);
//set event time frame (1 hour) the "initWithTimeInterval" is where we account for the users timezone by adding the correctedTime from GMT to the calendar time ( so its not off by hours when entering into calendar)
myEvent.startDate = [[[NSDate alloc] initWithTimeInterval:correctedTimeForCalendarEvent sinceDate:destinationDate ]autorelease];
myEvent.endDate = [[[NSDate alloc] initWithTimeInterval:3600 sinceDate:myEvent.startDate]autorelease];
myEvent.allDay = NO;
//set event reminders 1 day and 1 hour before
myAlarmsArray = [[[NSMutableArray alloc] init] autorelease];
EKAlarm *alarm1 = [EKAlarm alarmWithRelativeOffset:-3600]; // 1 Hour
EKAlarm *alarm2 = [EKAlarm alarmWithRelativeOffset:-86400]; // 1 Day
[myAlarmsArray addObject:alarm1];
[myAlarmsArray addObject:alarm2];
myEvent.alarms = myAlarmsArray;
[myEvent setCalendar:[eventDB defaultCalendarForNewEvents]];
NSError *err;
[eventDB saveEvent:myEvent span:EKSpanThisEvent error:&err];
if (err == noErr) {
//no error, but do not show alert because we do that below.
}
}
Utiliser - [NsdateDormatter SettiMezone:] code> pour fournir le formateur de date avec des informations sur le fuseau horaire. Vous pouvez utiliser le fuseau horaire local ou si vous avez un fuseau horaire fixe associé aux informations de date, je vous recommande de créer le fuseau horaire avec le nom (tel que "Amérique / Est") plutôt que l'abréviation (telle que "Est" ou "EDT"), puisque le nom ne force pas les économies de la journée en vigueur, mais utilise les économies de jour correctes offset pour cette date dans ce fuseau horaire. P>
Êtes-vous dans le fuseau horaire GMT-4?