2015-03-01 2 views
-1

J'ai une fonctionCréation NSDate à partir de composants sans "correction de fuseau horaire"

func createDate(day: Int, month: Int, year: Int) -> NSDate { 
    var comp = NSDateComponents() 
    comp.day = day 
    comp.month = month 
    comp.year = year 

    var cal = NSCalendar.currentCalendar() 

    if var date = cal.dateFromComponents(comp) { 
     return date 
    } 

    return NSDate() 
} 

Si je l'appelle avec

createDate(07, 01, 1984) 

la sortie est 1984-01-06 23:00:00 +0000. Je suppose qu'il y a une certaine influence du fuseau horaire. Comment puis-je ajuster mon code pour que la sortie soit 1984-01-07 00:00:00 +0000? Qu'est-ce que je me trompe ici? Comment suis-je confus?

+0

http://stackoverflow.com/questions/4976530/returns-a-date-an-hour-in-the-future/4976950#4976950 –

+2

Comme d'autres l'ont dit, un objet NSDate contient toujours l'UTC temps (ou une version conceptuelle de celui-ci), et c'est ce qui imprime lorsque vous le NSLog. Pour voir la bonne date/heure, utilisez NSDateFormatter dans votre fuseau horaire. –

Répondre

1

Il n'est pas nécessaire d'utiliser NSDateComponents pour entrer l'heure. NSCalendar a déjà une méthode pour vous d'entrer votre date en utilisant votre heure locale. Il s'appelle dateWithEra. "+0000" ce n'est pas votre heure locale (CET) c'est l'heure UTC. Votre timeZone n'est pas stocké avec votre objet NSDate, seulement la date et l'heure UTC correspondantes pour votre entrée localTime.

let myDate = NSCalendar.currentCalendar().dateWithEra(1, year: 1984, month: 1, day: 7, hour: 0, minute: 0, second: 0, nanosecond: 0)! 


myDate.descriptionWithLocale(NSLocale.currentLocale())! // "Saturday, January 7, 1984 at 12:00:00 AM Brasilia Standard Time" 


NSTimeZone.localTimeZone().secondsFromGMT 
0

Ne vous inquiétez pas de la sortie du journal. Ce sera un non formaté date. La date réelle semble être exactement ce que vous vouliez.

Si vous voulez montrer la date exacte, vous devez l'afficher en utilisant un NSDateFormatter.