Unterschied zwischen 'JJJJ' und 'JJJJ' in NSDateFormatter

75

Was ist der genaue Unterschied zwischen 'JJJJ' und 'JJJJ'? Ich habe in diesem Link gelesen , dass es heißt

Ein häufiger Fehler ist die Verwendung von JJJJ. JJJJ gibt das Kalenderjahr an, während JJJJ das Jahr (der „Woche des Jahres“) angibt, das im ISO-Jahres-Wochen-Kalender verwendet wird. In den meisten Fällen ergeben JJJJ und JJJJ die gleiche Anzahl, sie können jedoch unterschiedlich sein. Normalerweise sollten Sie das Kalenderjahr verwenden.

Aber wenn ich versuche zu benutzen

NSString *stringDate = @"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM dd, yyyy hh:mma"];
NSDate *date=[dateFormatter dateFromString:stringDate];
NSLog(@"Date 1 : %@",date); //2013-02-28 12:00:00 +0000

NSString *stringDatee = @"Feb 28, 2013 05:30pm";
NSDateFormatter *dateFormatterr = [[NSDateFormatter alloc] init];
[dateFormatterr setDateFormat:@"MMM dd, YYYY hh:mma"];
NSDate *datee=[dateFormatterr dateFromString:stringDatee];
NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(@"date 3 : %@", dateString); //Jan 05, 2013 05:30PM

Wie hier, Ergebnis zu dateund dateeunterschiedlich, was ich verstanden habe, aber warum sind Ergebnis von Datum 2 und Datum 3 unterschiedlich? Wie erstelle ich ein Datum aus einer Zeichenfolge und kehre es wieder in eine Zeichenfolge um, aber die Ausgabe stimmt nicht überein?

Hat jemand einen Grund dafür? Obwohl es die Woche des Jahres angibt, sollte ich trotzdem das gleiche Ergebnis erzielen.

Vielen Dank..

EDIT: -

Wenn ich codiere

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
NSString *dateString = [dateFormatterr stringFromDate:[NSDate date]];
NSLog(@"date: %@", dateString); //Feb 28, 2013 04:37PM

Wenn das Ergebnis das richtige Ergebnis ist, aber dasselbe, das ich bisher als Zeichenfolge übergeben habe 2013-01-05 12:00:00 +0000, überprüfen Sie Datum 2 von NSLog, Seltsames Ergebnis, warum?

PJ
quelle
1
Man sollte sich das WWDC 2011-Video mit dem Titel "Sitzung 117 - Durchführen von Kalenderberechnungen", 59:11, 142,2 MB (HD) "ansehen, um sich über die virtuelle Realität a là StarTrek zu informieren. Nein. Ich meine kalenderbasierte Berechnungen - und was nicht. Wenn Sie dieses Video nicht gesehen haben, schauen Sie es sich bitte an. Es ist sehr interessant, wenn Sie
@ DigiMonk Danke, ich werde es mir ansehen ..
PJ
ISO Woche Datum
Parag Bafna
1
Hauptsächlich arbeitet JJJJ manchmal, während JJJJ die ganze Zeit arbeitet. Wenn Sie sich die Spezifikation ansehen , ist (irgendwie) klar, warum.
Hot Licks
Der Unterschied zwischen Datum2 und Datum3 hat nichts mit dem Jahresformat zu tun und ist lediglich darauf zurückzuführen, dass die NSDate- descriptionMethode immer so (und in UTC) angezeigt wird - in einem NSDate gibt es kein "Format" (oder keine Zeitzone) .
Hot Licks

Antworten:

66

Auch bei Verwendung einer Datumsformatzeichenfolge ist die Verwendung des richtigen Formats wichtig.

@ "JJJJ" ist ein wochenbasiertes Kalenderjahr.

@ "JJJJ" ist ein gewöhnliches Kalenderjahr.

Sie können den gesamten Blog durchgehen, es ist gut, einen Blick darauf zu werfen

Geben Sie hier die Bildbeschreibung ein

https://web.archive.org/web/20150423093107/http://realmacsoftware.com/blog/working-with-date-and-time

http://realmacsoftware.com/blog/working-with-date-and-time (toter Link)

X Faktor
quelle
Vielen Dank für Ihre Antwort. Haben Sie mein NSLog von Datum 2 und Datum 3 überprüft? Warum sind sie anders? Ich übergebe das gleiche Format und die gleiche Sache ..
PJ
1
Ich hoffe, es liegt daran, dass Sie ein Datumsobjekt in eine Zeichenfolge konvertieren. Deshalb liefert es zwei verschiedene Ergebnisse.
X-Faktor
Wenn Sie ein Datum in eine Zeichenfolge konvertieren, wird das gleiche Ergebnis angezeigt
X-Factor
Ich mache Zeichenfolge-> Datum und dann Datum-> Zeichenfolge mit demselben Formatierer. Idealerweise sollte ich also wieder dasselbe Datum zurückgeben, das ich zuvor übergeben habe, aber nicht. Warum?
PJ
4
Der Link ist ausgefallen.
Clashsoft
27

Ein häufiger Fehler ist die Verwendung von JJJJ. JJJJ gibt das Kalenderjahr an, während JJJJ das Jahr (der „Woche des Jahres“) angibt, das im ISO-Jahres-Wochen-Kalender verwendet wird. In den meisten Fällen ergeben JJJJ und JJJJ die gleiche Anzahl, sie können jedoch unterschiedlich sein. Normalerweise sollten Sie das Kalenderjahr verwenden.

von Apple Docs

Gardner Bickford
quelle
Es tut mir leid. Ein Jahr hat 52 Wochen. Dieser Wert sollte in welcher Woche des Jahres das Datum sein. Dies ist gut für die Berechnung von Finanzposten oder wiederkehrenden Kalenderereignissen geeignet.
Gardner Bickford
1
Ich bin damit einverstanden, dass diese Kennung verwirrend ist und nicht gut ausgewählt wurde. Es gibt Standardgründe, warum es existieren muss: en.wikipedia.org/wiki/ISO_week_date
Gardner Bickford
datee ist ein NSLog-Objekt. Es wird eine Zeichenfolgendarstellung von sich selbst zurückgegeben, wenn es mit einer Zeichenfolge verkettet wird. Dies bedeutet, dass Sie sich beim Übergeben von datee an NSLog () auf das Standardformat von NSDate verlassen. Wenn Sie NSDate-Objekte mit dateWithString erstellen, sehen Sie möglicherweise den Unterschied.
Gardner Bickford
4
dd/MMM/YYYY - e.g.:1 01/Jan/2000; answer : 19/dec/1999
              (see weekly calendar December month last Monday
              suppose leaf year + 1 day)
dd/MMM/yyyy - eg: ordinary - no problem.
Gowthaman-Malve
quelle
Können Sie Ihre Antwort genauer beschreiben?
PJ
siehe Wochenkalender nur Dezember Monat und Montag Datum.
Gowthaman-Malve
1

Alle Antworten unterscheiden sich yyyyund YYYYsind die richtigen Antworten auf eine andere Frage. Die Frage selbst bezieht sich auf eine andere Sache.

Warum unterscheiden sich diese beiden Werte? (aus der Frage extrahiert)

NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000
NSLog(@"Date 3 : %@", dateString); //Jan 05, 2013 05:30PM

Die Antwort hier @PJ ist, dass sie sich im Wert nicht wirklich unterscheiden. Wenn Sie ein NSDate (Datum 2) protokollieren, erhalten Sie die vollständige Beschreibung Ihres Objekts, das sich zufällig in der UTC- Zeitzone befindet . Diese Logik tritt beim Protokollieren von Datum 3 nicht auf, da es bereits in einen String konvertiert und Ihre Zeitzone angewendet wurde.

Um Datum 3 auf die gleiche Weise zu drucken, wie Sie Datum 2 erhalten, sollten Sie UTC TimeZone für Datum 3 angeben.

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSString *dateString = [dateFormat stringFromDate:datee];
NSLog(@"date 3 : %@", dateString); 

Hoffe das hilft.

tl; dr die Zeitzone

CoderPug
quelle