5

正しく行う方法がわからない最も単純なタスクがあります。以下のスニペットで、月の始まりを知ることができます。

NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *beginning = nil;
[cal rangeOfUnit:NSMonthCalendarUnit startDate:&beginning interval:NULL forDate:self];
return beginning;

次に、同じ月の終わりを特定したいと思います (23:59:59 の最後の 1 秒が目的に合っています)。私が最初に考えたのは、翌月の 1 日から開始して 1 秒引くことでした。しかし、NSDateComponent インスタンスの日付を に分割することはできませんでした。12[dateComponents setMonth:[dateComponents month] + 1]月の場合、そのメソッドは 12 + 1 = 13 を受け入れず、1 月に到達できないからです。

では、月の最後の 1 秒に到達するにはどうすればよいでしょうか。

4

3 に答える 3

3

次の月の初めを取得するには、次のようにします。

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setMonth:1];
NSDate *beginningOfNextMonth = [cal dateByAddingComponents:comps toDate:beginning options:0];
[comps release];
于 2011-06-05T20:43:02.787 に答える
3

わかりました、私はそれを持っていると思います。このメソッドを使用してrangeOfUnit:inUnit:forDate:、現在の月の長さを日数で決定し、対応する NSTimeInterval を月の開始日に追加しています。

- (NSDate *)firstSecondOfTheMonth {
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDate *beginning = nil;
    if ([cal rangeOfUnit:NSMonthCalendarUnit startDate:&beginning interval:NULL forDate:self])
        return beginning;
    return nil;
}

- (NSDate *)lastSecondOfTheMonth {
    NSDate *date = [self firstSecondOfTheMonth];
    NSCalendar *cal = [NSCalendar currentCalendar];
    NSRange month = [cal rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
    return [date dateByAddingTimeInterval:month.length * 24 * 60 * 60 - 1];
}

注: このコードは意図したとおりに機能しますが、@spacehuntが提供した回答は、目的をより明確に伝えています。

于 2011-06-05T20:43:33.010 に答える
0

月の最後の 1 秒... ほとんどの場合、それは翌月の最初の 1 秒を取り、1 秒を引くことになります。

しかし、あなたは正しい質問をしていますか?その最後の1秒の意味は何ですか?私の推測では、月 N の最初の 1 秒から (およびそれを含めて) 開始し、月 N + 1 の最初の 1 秒の直前で終了する時間間隔を表現したいと考えています。

于 2011-06-05T20:27:48.693 に答える