2011-03-07 10 views
6

Czy jestem głupi? Przez cały ten czas myślałem, że [data NSDate] zwróciła lokalną datę i godzinę. Po kłopotach z NSStringformatter/stringFromdate/dateFromString dzisiaj zauważyłem, że moja [data NSDate] wracała 2011-03-06 11:00:00 +0000. Po zapoznaniu się z tym widzę, że [data NSDate] zwraca surową datę, która jest zawsze GMT.Czy [Data NSD] zwraca lokalną datę i godzinę?

Do czego służy przesunięcie gmt, jeśli wyświetla zawsze +0000? Również nie rozumiem [mój opis Daty]. Dokumenty mówią, że ma wyświetlać informacje o przesunięciach gmt oraz dst. Dostaję to samo co [data NSDate].

Najniższy wynik dla mnie, jeśli używam [data NSDate], aby uzyskać aktualną datę i jest po 14.00 Otrzymam jutrzejszą datę, ponieważ jestem w strefie czasowej -10. Nie wspominając już o problemach, które napotkałem dzisiaj z NSDateformatter.

Czy widzę to poprawnie? Zabawne jest to, że wydaje mi się, że widzę datę powrotu NSDate 2011-03-06 11:00:00 -36000, czy też myślę, że widziałem 2011-03-06 11:00:00 -10000.

Mogę z tym pracować, ale może ktoś może to wyjaśnić, aby lepiej zrozumieć NSDate.

+1

'+ [NSDate date]' zwraca obiekt data który jest autoreleased i ma aktualny czas. Powód, dla którego wyświetla się to samo, co '- [NSDate description]", oznacza, że ​​'NSLog' używa właściwości' description' obiektów, gdy '% @' jest w użyciu. –

+0

@RadekS, która powinna być odpowiedzią. Bo tak jest. :) – Alex

+0

@ Częściowa odpowiedź. –

Odpowiedz

20

NSDate zwraca bieżącą datę. Mimo że może konwertować na i z formatu strun w różnych lokalizacjach/strefach czasowych, NSDate nie ma wewnętrznej koncepcji strefy czasowej. NSDates nie są powiązane z żadnym konkretnym regionem. Jeśli Ty i ktokolwiek inny na świecie poprosiłbyś swoje urządzenia o jednoczesną [NSDate date], uzyskasz równe wyniki - nie dlatego, że zawsze powraca w GMT, ale dlatego, że nie powraca w sposób zależny od strefy czasowej. W Cocoa data jest szczególnym momentem w historii Ziemi. Sposób pisania daty jest związany z kalendarzem, strefą czasową i lokalną.

Nie otrzymujesz jutrzejszej daty, dostajesz poprawną datę, a następnie zauważasz, że podaje inny dzień, jeśli jest wyrażony w GMT. To poprawna data, napisana inaczej niż chcesz.

'description' to metoda, która została zastąpiona przez NSObject. Kiedy NSLog obiekt, co dzieje się wewnętrznie jest to, że metoda opisu jest wywoływana i zwracany ciąg jest drukowany. Więc powinieneś uzyskać identyczne wyniki z logowania object i [object description], ponieważ poprzedni wywołuje opis i drukuje ten ciąg, drugi wywołuje opis, a następnie wywołuje opis na wynikowym ciągu i drukuje to. NSStrings zwracają się w wyniku opisu.

To powinno być zachowanie domyślne ale żeby zrozumiały opis, spróbuj:

NSLog(@"%@", [[NSDate date] descriptionWithCalendarFormat:nil 
      timeZone:[NSTimeZone localTimeZone] locale:[NSLocale currentLocale]]); 

Jeśli nadal loguje GMT wówczas urządzenie uważa się być w GMT. Nie mam pojęcia, jak niezawodny jest symulator tego typu rzeczy.

+0

Tommy, dzięki. To było bardzo pomocne. W odniesieniu do twojego oświadczenia o tym, dając mi jutro datę. Rozumiem twój punkt widzenia, ale spodziewałem się, że otrzymam datę w mojej strefie czasowej (lokalna data i godzina), więc dla mnie jest to data jutra. Myślę, że jest to tylko przypadek semantyki, ale dla wszystkich intencji i celów nie [data NSDate] zwraca GMT, ponieważ GMT jest zerową strefą czasową. Świetna odpowiedź - dzięki. – user278859

+0

Czy mógłbyś odpowiedzieć na jeszcze jedno pytanie? Mam problem ze zrozumieniem, co dokumentacja mówi o [NSTimeZone localTimeZone]. Mówi, że "zwraca obiekt, który przekazuje wszystkie wiadomości do domyślnej strefy czasowej dla bieżącej aplikacji". Co to znaczy. Dla mnie oznacza to, że wywoływanie go w jakiś sposób wpływa na kolejne operacje z datami lub czasami. Dzięki. – user278859

+0

Myślę, że nieco okrężne sformułowanie jest po prostu dlatego, że obiekt zwracany przez localTimeZone pozostaje semantycznie poprawny, nawet jeśli strefa czasowa się zmienia, podczas gdy defaultTimeZone nie. Tak więc pierwszy obiekt wydaje się automatycznie aktualizować, ale drugi nie. Co wewnętrznie jest dodatkowym poziomem pośrednictwa, ale wydaje się, że prawdopodobnie powiedzieli nam więcej, niż powinniśmy wiedzieć o implementacji. – Tommy

-1

W Swift:

NSDate() daje nam opis agnostykiem data jest, że zawsze zwraca datę czasu UTC + 0, niezależnie od strefy czasowej urządzenia:

print(NSDate()) 

.descriptionWithLocale (NSLocale.currentLocale())! daje nam zlokalizowaną data opis UTC + N Data Godzina gdzie N oznacza przesunięcie (dodatnią lub ujemną) pomiędzy UTC + 0 i bieżącego czasu lokalnego Data:

print(NSDate().descriptionWithLocale(NSLocale.currentLocale())!) 
+0

Nie zapewnia to odpowiedzi na pytanie. Aby skrytykować lub poprosić o wyjaśnienie od autora, pozostaw komentarz pod swoim postem. –

+0

Obecnie pracuję z NSDate, więc będę stopniowo poprawiał moją odpowiedź i wyjaśnienia. –

+0

'NSDate' nie ma strefy czasowej. To nie jest UTC + 0. – Sulthan

Powiązane problemy