//

Help! Bug in NSDate!

Help! Bug in NSDate! discussie in Ontwikkelen voor iOS forum; ( verdwijnt na registratie ) 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 ...



Ga terug   iPhone, iPod touch, iPad en Apple TV forum > Development > Ontwikkelen voor iOS
Wachtwoord vergeten? Registreren!
Registreer FAQ Ledenlijst Kalender Berichten van vandaag

Reageren

 

Discussietools Weergave
  #1  
Oud 31-05-09, 00:51
markvwijnen markvwijnen is offline
• iOS 5.0.1
• 5.0.1
• Besturingssysteem: Mac OS X
 
Geregistreerd: Jan 2009
Berichten: 113
Standaard 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.

Laatst gewijzigd door markvwijnen; 31-05-09 om 10:31.
Advertentie
Advertentie Gesponsorde links (verdwijnt na registratie)

  #2  
Oud 31-05-09, 10:32
markvwijnen markvwijnen is offline
• iOS 5.0.1
• 5.0.1
• Besturingssysteem: Mac OS X
 
Geregistreerd: Jan 2009
Berichten: 113
Standaard

Timmeh zou je dit topic willen verwijderen?
  #3  
Oud 31-05-09, 11:10
Myrdhin Myrdhin is offline
• iOS 8.0
• 8.0
• Besturingssysteem: Mac OS X
 
Geregistreerd: Mar 2008
Locatie: Omgeving Nijmegen
Berichten: 94
Standaard

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.

Laatst gewijzigd door Myrdhin; 31-05-09 om 11:13.
  #4  
Oud 31-05-09, 11:20
Timmeh_'s schermafbeelding
Timmeh_ Timmeh_ is offline
iPhone(club) Guru
• iOS 5.0 Beta
• 5.0 Beta
• Besturingssysteem: Mac OS X
 
Geregistreerd: Sep 2008
Locatie: Amsterdam
Berichten: 2.892
Stuur een bericht via MSN naar Timmeh_
Standaard

Citaat:
Oorspronkelijk geplaatst door markvwijnen Bekijk bericht
Timmeh zou je dit topic willen verwijderen?
Ik laat m staan, voor als iemand dezelfde gedachtengang maakt
__________________
iPhone 2G UK iOS 3.1.3 Jailbreak by RedSn0w /  iPhone 4 32GB iOS 4.2.1 Jailbreak by RedSn0w
MacBook Pro 15,4" OSX 10.6.6 /  iMac 20" OSX 10.6.6 /  iPad 3G 32GB iOS 4.2.1
Stuur me geen privé-berichten met vragen, ik negeer ze. Gebruik liever de zoekfunctie en de Wiki (Begrippen|Handleidingen)
  #5  
Oud 31-05-09, 11:58
markvwijnen markvwijnen is offline
• iOS 5.0.1
• 5.0.1
• Besturingssysteem: Mac OS X
 
Geregistreerd: Jan 2009
Berichten: 113
Standaard

Heej Myrdhin,

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

Grz Mark
Reageren



Er zijn 1 actieve gebruikers die momenteel deze discussie bekijken (0 leden en 1 gasten)

 

Soortgelijke discussies

Discussie Auteur Forum Reacties Laatste bericht
Bug op iPad CptYanni iPad algemeen 5 02-01-11 23:14
Agenda bug pjobse iPhone algemeen 3 07-12-10 10:27
Volgende dag selecteren (NSDate) SkyTrix Ontwikkelen voor iOS 10 31-07-09 14:05
Bug in codeslot? neht iPhone algemeen 4 21-04-09 16:06

Regels voor berichten
Je mag geen nieuwe discussies starten
Je mag niet reageren op berichten
Je mag geen bijlagen versturen
Je mag niet je berichten bewerken

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit
Trackbacks are Aan
Pingbacks are Aan
Refbacks are Uit



Alle tijden zijn GMT +2. Het is nu 14:58.