0

myObject.theEndおよびmyObject.theStart文字列であり、同様の日付形式を持っていますThu Feb 31...

NSDateFormatter *format=[[NSDateFormatter alloc] init];
        [format setDateFormat:@"EEE MMM dd"]; 
        NSDate *end = [format dateFromString:myObject.theEnd];
        NSDate *start = [format dateFromString:myObject.theStart];
        NSDate *current = [NSDate date];

の場合、 とtheEnd表示されます。やも同様です。Thu Feb 31NSDate *end1970-5-19 14:30 +0000NSDate *startNSDate *current

どうしてこれなの ?どうすればこれを解決できますか?

4

1 に答える 1

6

として表示されていないに違い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" =です)に解析しているため。19701970-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);
于 2012-05-20T15:42:45.453 に答える