2011-07-06 14 views
5

Moja aplikacja użyła funkcji [Data NSD], aby uzyskać aktualną datę. Jego działanie dobrze inne dni oprócz 1 każdego miesiąca podczas AM. tj. Wykonaj następujące kroki:NSDate zwraca niewłaściwą datę pierwszego dnia miesiąca

  1. Ustaw datę systemową jako 01 - czerwiec - 2011 & czas między 00.00 północy a 5,59 AM.
  2. użyć poniższy kod:
    NSLog(@"Current Date :: %@",[NSDate date]);

O/P :: Aktualna data :: 2011-05-31 19:40:21 +0000

Pożądany O/P is :: Bieżąca data :: 2011-06-01 00: 00: 0 (ustawiony czas) +0000

Również od 6 AM to działa dobrze.

Jaki jest tego powód?

Właściwie nie chcę NSDate w formacie ciąg, ale to, czego chcę, to obiekt daty NSDate odpowiadający pierwszej dacie bieżącego miesiąca. Do korzystania z poniższego fragmentu kodu:

NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; 
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 

NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit 
| NSDayCalendarUnit) fromDate:[NSDatedate]]; 

[comp setDay:1];  

NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp]; 

[gregorian release]; 

return firstDayOfMonthDate; 

Ponieważ [Data NSDate] zwraca nieprawidłową datę, komponenty zawierają również niepoprawną datę. Powyższy kod działa dla wszystkich senario z wyjątkiem senario, który napisałem na początku tego wątku. Co powinienem zrobić?

+0

Biorąc pod uwagę te informacje, nie mogę wymyślić powodu, dlaczego tak powinno być. Być może jest to błąd? –

Odpowiedz

0

Czy używasz wersji 4.2 systemu iOS? Jeśli tak, to istnieje pewien problem z metodą daty, nie wydaje się, że szanuje lokalną strefę czasową. Na przykład, jeśli mogę uruchomić swój kod w iOS 4.0 symulatorze, otrzymuję ten wynik:

Current Date :: 2011-07-06 10:43:38 -0400

Ale jeśli uruchomię go w iOS 4.2 symulatorze, otrzymuję to:

Current Date :: 2011-07-06 14:44:18 +0000

Oto siebie tak, że po to opisano bardziej szczegółowo:

NSDate et al woes on iOS 4.2

Jeśli tylko szukasz bieżącej daty i czasu w NSString, używam kod, który wygląda tak, aby zrealizować to zadanie:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setFormatterBehavior:NSDateFormatterBehavior10_4]; 
[formatter setDateStyle:NSDateFormatterShortStyle]; 
[formatter setTimeStyle:NSDateFormatterShortStyle]; 
NSString *result = [formatter stringFromDate:[NSDate date]]; 
[formatter release]; 
NSLog(@"Current Date v2 :: %@",result); 
+0

Ale chcę obiektu NSDate lub NSDateComponents Obj i nie ciąg. Co powinienem zrobić? –

+0

w oczekiwaniu na odpowiedź? –

2

wreszcie rozwiązanie:

Chodzi o to, NSDate obiekty nie mają strefy czasowej związanej z nimi, a kilka wydań z powrotem ktoś w Apple zdecydował, że metoda NSDate -description, która jest używana przez NSLog, powinna używać GMT + 0, a NIE lokalnej strefy czasowej dla wyjścia. (Zakładam, że ktoś miał błąd, który spowodował uszkodzenie ustawień lokalnych, i które spowodowało awarię metody opisywania NSDate, a więc zgłaszano zgłoszenia błędów ...)

Skrócona wersja: Użyj NSDateFormatter do wyprowadzania dat. Nie używaj -opisania.

+0

... lub podklas NSDate i napisz własną metodę opisu. –

+0

Dlatego w opisie występuje "+0000". – Sulthan

Powiązane problemy