NSDateFormatter возвращает nil для @ "dd-MM-yy" в iOS 3.0 - PullRequest
2 голосов
/ 03 ноября 2010

У меня есть эта часть кода:

NSDate *date =nil;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateFormat:@"dd-MM-yy"];
date = [dateFormatter dateFromString:inString];
[dateFormatter release];

Работает отлично, как и ожидалось в iOS 4.0. Но тот же код не в 3.0.

Строка, которую я получаю, похожа на «12-Nov-10», и она содержится в указателе inString.

Форматер даты возвращает ноль, если нативная ОС - 3.0 или 3.1. По некоторым причинам мне нужно придерживаться того же формата даты. Кто-нибудь еще сталкивался с этой проблемой? Любые предложения по решению этой проблемы?

Спасибо

Raj

Edit: Правильный код, после следующих предложений, указанных Харконяном и обсуждением вопросов и ответов:

NSDate *date =nil;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateFormat:@"dd-MMM-yy"];

NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[dateFormatter setLocale:enUSPOSIXLocale];
[enUSPOSIXLocale release];

date = [dateFormatter dateFromString:inString];
[dateFormatter release];

Ответы [ 2 ]

10 голосов
/ 25 декабря 2011

Чрезвычайно полезной страницы больше не существует, поэтому просто поместите ее содержимое здесь для архивных целей:

a:  AM/PM
A:  0~86399999 (Millisecond of Day)

c/cc:   1~7 (Day of Week)
ccc:    Sun/Mon/Tue/Wed/Thu/Fri/Sat
cccc:   Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday

d:  1~31 (0 padded Day of Month)
D:  1~366 (0 padded Day of Year)

e:  1~7 (0 padded Day of Week)
E~EEE:  Sun/Mon/Tue/Wed/Thu/Fri/Sat
EEEE:   Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday

F:  1~5 (0 padded Week of Month, first day of week = Monday)

g:  Julian Day Number (number of days since 4713 BC January 1)
G~GGG:  BC/AD (Era Designator Abbreviated)
GGGG:   Before Christ/Anno Domini

h:  1~12 (0 padded Hour (12hr))
H:  0~23 (0 padded Hour (24hr))

k:  1~24 (0 padded Hour (24hr)
K:  0~11 (0 padded Hour (12hr))

L/LL:   1~12 (0 padded Month)
LLL:    Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
LLLL:   January/February/March/April/May/June/July/August/September/October/November/December

m:  0~59 (0 padded Minute)
M/MM:   1~12 (0 padded Month)
MMM:    Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
MMMM:   January/February/March/April/May/June/July/August/September/October/November/December

q/qq:   1~4 (0 padded Quarter)
qqq:    Q1/Q2/Q3/Q4
qqqq:   1st quarter/2nd quarter/3rd quarter/4th quarter
Q/QQ:   1~4 (0 padded Quarter)
QQQ:    Q1/Q2/Q3/Q4
QQQQ:   1st quarter/2nd quarter/3rd quarter/4th quarter

s:  0~59 (0 padded Second)
S:  (rounded Sub-Second)

u:  (0 padded Year)

v~vvv:  (General GMT Timezone Abbreviation)
vvvv:   (General GMT Timezone Name)

w:  1~53 (0 padded Week of Year, 1st day of week = Sunday, NB: 1st week of year starts from the last Sunday of last year)
W:  1~5 (0 padded Week of Month, 1st day of week = Sunday)

y/yyyy: (Full Year)
yy/yyy: (2 Digits Year)
Y/YYYY: (Full Year, starting from the Sunday of the 1st week of year)
YY/YYY: (2 Digits Year, starting from the Sunday of the 1st week of year)

z~zzz:  (Specific GMT Timezone Abbreviation)
zzzz:   (Specific GMT Timezone Name)
Z:  +0000 (RFC 822 Timezone)
7 голосов
/ 04 ноября 2010

Если вы работаете с видимыми пользователем датами, вам следует избегать установки строки формата даты, потому что очень сложно предсказать, как ваша строка формата будет выражаться во всех возможных пользовательских конфигурациях. Скорее, вы должны попытаться ограничить себя настройкой даты и времени (через - [NSDateFormatter setDateStyle:] и - [NSDateFormatter setTimeStyle:]).

С другой стороны, если вы работаете с датами фиксированного формата, вы должны сначала установить для локали форматера даты нечто подходящее для вашего фиксированного формата. В большинстве случаев лучшим языком для выбора является en_US_POSIX, язык, специально разработанный для получения результатов на английском языке США, независимо от пользовательских и системных предпочтений. «en_US_POSIX» также инвариантен во времени (если США в какой-то момент в будущем изменят способ форматирования дат, «en_US» изменится, чтобы отразить новое поведение, но «en_US_POSIX» не будет), и между компьютерами ( «en_US_POSIX» работает на iPhone OS так же, как на Mac OS X и на других платформах).

После того, как вы установили en_US_POSIX в качестве локали форматера даты, вы можете установить строку формата даты, и форматер даты будет работать согласованно для всех пользователей.

Приведенную выше информацию и многое другое можно найти в Apple Технический Q & A QA1480

Вот фрагмент кода из моего приложения, который реализует приведенную выше рекомендацию:

static NSDateFormatter* dateFormatter = nil;
if (!dateFormatter) {
   dateFormatter = [[NSDateFormatter alloc] init];

   NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] 
      initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
   assert(enUSPOSIXLocale != nil);
   [dateFormatter setLocale:enUSPOSIXLocale];
   [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
   dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000";
}
...