Різниця між "РРРР" та "РРРР" у NSDateFormatter


77

Яка точна різниця між "РРРР" та "РРРР". Я читав у цьому посиланні , там сказано

Поширеною помилкою є використання РРРР. yyyy вказує календарний рік, тоді як YYYY вказує рік («тижня року»), що використовується в календарі ISO-рік-тиждень. У більшості випадків РРРР і РРРР дають одне і те ж число, однак вони можуть відрізнятися. Зазвичай слід використовувати календарний рік.

Але коли я намагаюся використовувати

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

Як і тут, результат до dateта dateeрізний, що я зрозумів, але чому результат дати 2 та дати 3 відрізняються? Оскільки я створюю дату із рядка і знову перетворюю її на рядок, але вивожу невідповідність?

Хтось знає причину того самого ?. Хоча це вказує тиждень року, все одно я повинен отримати результат таким же.

Дякую..

РЕДАГУВАТИ: -

Якщо я кодую

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

Якщо результати дають мені належний результат, але той самий, який я передаю як рядок на сьогоднішній день, я 2013-01-05 12:00:00 +0000перевіряю дату 2 NSLog, Дивний результат, чому?


1
Слід переглянути відео WWDC 2011 "Сесія 117 - Виконання обчислень календаря", 59:11, 142,2 МБ (HD) ", щоб отримати інформацію про віртуальну реальність у StarTrek? Ні. Я маю на увазі розрахунки на основі календаря - а що ні. Якщо ви не бачили цього відео, перегляньте його, дуже цікаво, якщо вам подобаються подібні речі

@DigiMonk Дякую, я подивлюсь на це ..
PJ


1
Головним чином, РРРР працює частину часу, тоді як РРРР працює весь час. Якщо ви подивитесь на специфікацію, тоді (сорта) зрозуміло, чому.
Hot Licks

І різниця між датою2 і датою3 не має нічого спільного з форматом року і пов’язана виключно з тим, що descriptionметод NSDate завжди відображається таким чином (і в UTC) - у NSDate немає «формату» (або часового поясу) .
Hot Licks

Відповіді:


71

Також при використанні рядка формату дати важливим є правильний формат.

@ "РРРР" - тижневий календарний рік.

@ "yyyy" - звичайний календарний рік.

Ви можете пройти весь блог, це добре, щоб поглянути на нього

введіть тут опис зображення

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

http://realmacsoftware.com/blog/working-with-date-and-time (мертве посилання)


Дякуємо за вашу відповідь, чи перевіряли ви мій журнал NSL дати 2 та дати 3? Чому вони різні? Я передаю той самий формат і те саме ...
PJ

1
Я сподіваюся, що це тому, що ви перетворюєте об'єкт дати у рядок, ось чому він дає 2 різні результати.
X-Factor

кожного разу, коли ви перетворюєте дату в рядок, вона показує той самий результат, який ви бачите, перегляньте блог iosdevelopertips.com/cocoa/date-formatters-examples-take-3.html
X-Factor

Я роблю рядок-> дата, а потім дату-> рядок з тим же форматором, тому в ідеалі це має повернути мені ту саму дату, яку я передав раніше, але це не так. Чому?
PJ

4
Посилання недоступне.
Clashsoft

29

Поширеною помилкою є використання РРРР. yyyy вказує календарний рік, тоді як YYYY вказує рік («тижня року»), що використовується в календарі ISO-рік-тиждень. У більшості випадків РРРР і РРРР дають одне і те ж число, однак вони можуть відрізнятися. Зазвичай слід використовувати календарний рік.

від Apple Docs


Вибачте, погано. У році буває 52 тижні. Це значення повинно бути повернуто, який тиждень року є датою. Це було б добре для розрахунку фінансових статей або періодичних календарних подій.
Гарднер Бікфорд,

1
Я погоджуюсь, що цей ідентифікатор заплутаний і був неправильно вибраний. Існують стандарти, чому він повинен існувати: en.wikipedia.org/wiki/ISO_week_date
Гарднер Бікфорд,

datee - це об'єкт NSLog. Він буде повертати рядкове представлення самого себе, якщо об'єднано з рядком. Це означає, що ви покладаєтесь на формат за замовчуванням NSDate, передаючи datee NSLog (). Якщо ви створюєте об'єкти NSDate за допомогою dateWithString, ви можете побачити різницю.
Гарднер Бікфорд

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.

Чи можете ви описати свою відповідь докладніше?
PJ

дивіться лише тижневий календар грудень місяць і дату понеділка.
gowthaman-mallow

1

Усі відповіді диференціюються yyyyі YYYYє правильними відповідями на інше питання. Саме питання стосується іншої речі.

Чому ці два значення відрізняються? (витягнуто з питання)

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

Відповідь тут @PJ полягає в тому, що вони насправді не відрізняються за значенням. При вході в NSDate (що дата 2) Ви отримуєте повний опис вашого об'єкта , який трапляється бути на UTC Timezone . Ця логіка не відбувається під час реєстрації дати 3, оскільки вона вже була перетворена у рядок і застосувала ваш часовий пояс.

Для друку дати 3 так само, як і для дати 2. Ви повинні вказати часовий пояс UTC для дати 3. Щось подібне:

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); 

Сподіваюся, це допомагає.

tl; dr Часовий пояс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.