として表示されていないに違いtheEnd
ありません1970-05-19 14:30 +0000
。(null)
2 月 31 日がないため、表示されているに違いありません。たとえば、次のようになります。
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"EEE MMM dd"];
NSDate *end = [format dateFromString:@"Thu Feb 31"];
NSLog(@"end = %@", end);
=>
2012-05-20 16:38:31.620 test-date[42307:707] end = (null)
また、UTC から 9.5 時間東のタイムゾーンにいると思います。の今日の日付を解析すると1970-05-19 14:30 +0000
、実際に得られるものですSun May 20
。たとえば、私は現在BSTにいるので、UTC + 0100で次のようになります:
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"EEE MMM dd"];
NSDate *start = [format dateFromString:@"Sun May 20"];
NSLog(@"start = %@", start);
=>
2012-05-20 16:38:31.621 test-date[42307:707] start = 1970-05-19 23:00:00 +0000
UTCである現在のタイムゾーンで1970-05-20 00:00:00
(年がないため、コンポーネントは " 0
" =です)に解析しているため。1970
1970-05-19 23:00:00 +0000
この問題を回避するには、フォーマッタのタイムゾーンを UTC に設定します。
[format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
年を現在の年にするには、次のようにします。
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"EEE MMM dd"];
[format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *start = [format dateFromString:@"Sun May 20"];
NSLog(@"start = %@", start);
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents = [gregorian components:NSYearCalendarUnit fromDate:today];
NSDateComponents *startComponents = [gregorian components:(NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:start];
[startComponents setYear:[todayComponents year]];
[startComponents setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
start = [gregorian dateFromComponents:startComponents];
NSLog(@"start = %@", start);
それほどきれいではありませんが、機能します。または、フォーマッタに渡す文字列に現在の年を追加yyyy
し、フォーマッタ スタイルに追加することもできます。
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"EEE MMM dd yyyy"];
[format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *today = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todayComponents = [gregorian components:NSYearCalendarUnit fromDate:today];
NSString *dateString = [NSString stringWithFormat:@"Sun May 20 %i", [todayComponents year]];
NSDate *start = [format dateFromString:dateString];
NSLog(@"start = %@", start);