0

BOOLの戻り値と2つの入力(NSDateComponents *)パラメーターを持つ関数があります。私の問題は、2つのNSDateComponents値があり、2つの日付が同じ暦週内にあるかどうかを知りたいことです。私は問題を解決するために最も簡単な解決策を試しました、私の考えは次のとおりでした:

- (BOOL)isFunctionName:(NSDateComponents *)comp1 andParam:(NSDateComponents *)comp2 { return (([comp1 week] == [comp2 week]) && ([comp1 year] == [comp2 year])); }

しかし、それは正しくありません。どのように私はそれを解決することができますか?


編集

だから私は日付からdatecomponentsを作る関数を持っています。

-(NSDateComponents *)dateToDateComponents:(NSDate *)date { unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *dateComponents = [gregorian components:unitFlags fromDate:date]; [gregorian release]; return dateComponents; }

そして私はそれをこのように呼びます:

if ([self isFunctionName: [self dateToDateComponents:startDate] and Param:[self dateToDateComponents:currentTripDate]]){ }

テスト中は、すべての日付でYESが返されます(たとえば、2010.07.21〜2010.08.18)。

4

3 に答える 3

2

これはロバートの答えに触発されています。1週間が2年を超える場合、たとえば2012年12月31日と2013年1月1日など、この問題に対処するために少し調整しました。

- (BOOL)isOnSameWeekAsDate:(NSDate*)otherDate
{
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    unsigned unitFlags = NSCalendarUnitYearForWeekOfYear | NSCalendarUnitWeekOfYear;

    NSDateComponents *components = [calendar components:unitFlags fromDate:self];
    NSDateComponents *otherComponents = [calendar components:unitFlags fromDate:otherDate];

    return ( [components yearForWeekOfYear] == [otherComponents yearForWeekOfYear] && [components weekOfYear] == [otherComponents weekOfYear] );
}
于 2013-01-07T22:26:10.893 に答える
1

NSDateComponentクラスリファレンスは次のように述べています。

重要: オブジェクトNSDateComponents自体は無意味です。どのカレンダーに対して解釈されるかを知る必要があり、値が単位の絶対値なのか、単位の数量なのかを知る必要があります。

NSDate代わりにsを比較するのはどうですか?

- (BOOL) weekIsEqual:(NSDate *)date and:(NSDate *)otherDate {
  NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

  NSDateComponents *dateComponents      = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit fromDate:date];
  NSDateComponents *otherDateComponents = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit fromDate:otherDate];

  return [dateComponents week] == [otherDateComponents week] && [dateComponents year] == [otherDateComponents year];
}

編集:この行で:

 unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;

あなたは合格しないのでNSWeekCalendarUnit[dateComponent week]NSUndefinedDateComponent

編集

もちろん、それはNSWeekCalendarUnit…</p> でなければなりません

于 2010-08-25T14:14:00.643 に答える
0

iOS8以降、これははるかに簡単になりました。

-(BOOL)isDate:(NSDate *)date1 onSameWeekAs:(NSDate *)date2
{
    return [[NSCalendar currentCalendar] isDate:date1
                                    equalToDate:date2
                              toUnitGranularity:NSCalendarUnitWeekOfYear];
}

ドキュメントから:

指定された単位以上のすべての単位に対して両方の日付の日付コンポーネントが等しい場合はYESを返し、それ以外の場合はNOを返します。

于 2016-02-12T01:13:48.547 に答える