iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   Help! Bug in NSDate! (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/34789-help-bug-nsdate.html)

markvwijnen 31-05-09 00:51

NSDate [Solved]
 
Hallo iedereen,

Snap er niks van, ben met deze schijnbare bug al uren zoet mee. Hopelijk kan iemand mij helpen.

Achtergrond
Ben een kalender aan het maken voor de iPhone. Bij de meeste dagen en maanden ging het goed maar ik stuitte op een specifieke datum waarbij er iets mis gaat.

Code om het na te bootsen
Code:

        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
       
        [dateFormatter setLocale:locale];
        [dateFormatter setDateFormat:@"d-M-yyyy h:m:s"];
       
        NSDate *date      = [dateFormatter dateFromString:@"25-10-2009 1:59:59"];
        NSDate *dateBugged = [dateFormatter dateFromString:@"25-10-2009 2:0:0"];
       
        NSLog ([date description]);
        NSLog ([dateBugged description]);
       
        [dateFormatter release];
        [locale release];

Output
Code:

2009-10-25 01:59:59 +0200
2009-10-25 02:00:00 +0100

Probleem
Nu lijkt dit op het eerste gezicht nog geen probleem. Maar dit wordt wel een probleem als je je deze code bedenkt.
Code:

        NSDate *date                = [dateFormatter dateFromString:@"25-10-2009 1:59:59"];
        NSTimeInterval timeInterval = 86400; // 1 dag
        NSDate *dateBugged = [[[NSDate alloc] initWithTimeInterval:timeInterval sinceDate:date] autorelease];

Dit geeft namelijk als output
Code:

2009-10-25 01:59:59 +0200
2009-10-26 00:59:59 +0100

En geeft al helemaal een rare output als je de *date op 0:0:0 zet. Dan blijft die namelijk op dezelfde datum na een dag. Waarschijnlijk door het timezone probleem want normaal zou die dan op 2009-10-26 00:00:00 komen maar 1 uur tijdsverschil eraf blijftie opdezelfde dag.
Code:

2009-10-25 00:00:00 +0200
 2009-10-25 23:00:00 +0100


Mogelijke eigen oplossing

Een mogelijke oplossing is door het huidige tijdsverschil GMT+0200 te bewaren en mocht er een verschil komen in tijdszones. Het verschil in uren in code erbij te tellen. Dus in het geval van +0100. 2 - 1 = 1 * 86400 = 86400 + de tijd. Maar dit is wel erg lelijk.

Vraag
Op de een of andere vage reden, beweegt NSDate zich door een timezone. De vraag is, heeft iemand een idee waarom dit gebeurd?

Antwoord
Op 25 oktober 2009 gaat de wintertijd in. Blijf het raar vinden dat ze dan de GMT aanpassen, laat de GMT dan hetzelfde en doe gewoon een uurtje terug.

markvwijnen 31-05-09 10:32

Timmeh zou je dit topic willen verwijderen?

Myrdhin 31-05-09 11:10

edit
Ah ok, zomer/wintertijd probleem... Geen bug dus.. Dat ze de GMT aanpassen is op zich logisch, want dat is ook wat er feitelijk gebeurt.
/edit


Het lijkt op een bug in de timezone detectie in NSDateFormatter. Als je specifiek de timezone meegeeft werkt het wel goed:
Code:

        [dateFormatter setDateFormat:@"dd-MM-yyyy hh:mm:ss z"];
       
        NSDate *date      = [dateFormatter dateFromString:@"25-10-2009 01:59:59 +0200"];
        NSDate *dateBugged = [dateFormatter dateFromString:@"25-10-2009 02:00:00 +0200"];

Ik heb ook geprobeerd om de timezone in te stellen in NSDateFormatter, maar dat helpt dus ook niet.

Workaround: vraag je huidige timezone op en voeg die toe als je een datum wilt omzetten van string naar NSDate.

Timmeh_ 31-05-09 11:20

Citaat:

Oorspronkelijk geplaatst door markvwijnen (Bericht 290652)
Timmeh zou je dit topic willen verwijderen?

Ik laat m staan, voor als iemand dezelfde gedachtengang maakt ;)

markvwijnen 31-05-09 11:58

Heej Myrdhin,

Super bedankt dat je zo actief bent en wederom de moeite hebt genomen me te helpen. Waardeer ik enorm.

Grz Mark


Alle tijden zijn GMT +2. Het is nu 23:19.