0

今月の開始日と終了日を取得しようとしています。ここにいくつかの同様の質問がありますが、それらを使用しているときに予期しない結果が得られます。これが私がしたことです:

NSDate *monthStart,*monthEnd;   
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];          
NSDateComponents *comps = [cal components:NSDayCalendarUnit fromDate:[NSDate date]];
[comps setDay:1];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
monthStart = [cal dateFromComponents:comps];
[comps setDay:[[NSCalendar currentCalendar]
               rangeOfUnit:NSDayCalendarUnit
               inUnit:NSMonthCalendarUnit
               forDate:[NSDate date]].length];
[comps setHour:23];
[comps setMinute:59];
[comps setSecond:59];
monthEnd = [cal dateFromComponents:comps];
NSLog(@"%@",monthStart);
NSLog(@"%@",monthEnd);

残念ながら、出力は次のとおりです。

2012-12-24 15:39:28.159 Popup[1010:403] 0001-12-31 18:06:32 +0000
2012-12-24 15:39:28.160 Popup[1010:403] 0001-01-31 18:06:31 +0000

ところで、私のマシンで設定されているタイムゾーンは+5:30です

4

2 に答える 2

1

正しい答えを得るために、コードを少し変更しました

NSDate *monthStart,*monthEnd;
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:currentDate];
[comps setDay:1];
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
[cal setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:19800]];
monthStart = [cal dateFromComponents:comps];


[comps setDay:[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].length];
[comps setHour:23];
[comps setMinute:59];
[comps setSecond:59];
monthEnd = [cal dateFromComponents:comps];

NSLog(@"Start %@",monthStart);
NSLog(@"End   %@",monthEnd);
于 2012-12-24T11:25:58.957 に答える
0

今月の開始日と終了日を知りたい場合...

開始は常に1日で、終了は月の名前で計算できます!!!

次に、それは非常に単純な日付演算です。

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];

NSMutableArray *months=[NSMutableArray arrayWithObjects:@"Jan",@"Feb",@"Mar",@"Apr",@"May",@"Jun",@"Jul",@"Aug",@"Sep",@"Oct",@"Nov",@"Dec", nil];
NSMutableArray *days=[NSMutableArray arrayWithObjects:@"31",@"28",@"31",@"30",@"31",@"30",@"31",@"31",@"30",@"31",@"30",@"31", nil];
//check if leap
[dateFormat setDateFormat:@"YYYY"];
NSInteger year=[[dateFormat stringFromDate:[NSDate date]]integerValue];
if(((year%4==0)&&(year%100!=0))||(year%400==0)) {
    [days replaceObjectAtIndex:1 withObject:@"29"];
}

NSMutableDictionary *daysInMonthDict=[[NSMutableDictionary alloc]initWithObjects:days forKeys:months];

[dateFormat setDateFormat:@"MMM"];
NSLog(@"Starting date is 1 and ending date is %@",[daysInMonthDict objectForKey:[dateFormat stringFromDate:[NSDate date]]]);
于 2012-12-24T11:54:57.597 に答える