4

重複の可能性:
現在の現地時間が2回の間にあるかどうかを判断します(日付部分を無視します)

iOSでは、どうすれば次のことができますか?

NSDate店舗の開店時間と閉店時間を表す2つのオブジェクトがあります。これらのオブジェクト内の時刻は正確ですが、日付は指定されていません(ストアは日付に関係なく同時に開閉します)。現在の時刻がこの時間枠の間にあるかどうかを確認するにはどうすればよいですか?

NSDate開始時間と終了時間がオブジェクト以外の別の形式であることが役立つ場合は、それで問題ないことに注意してください。現在、ファイルから「12:30」などの日付文字列を読み取り、日付フォーマッタを使用して一致するNSDateオブジェクトを作成しています。

4

1 に答える 1

15

更新: このソリューションはお客様のケースに固有であり、店舗の営業時間は2日間ではないと想定していることに注意してください。たとえば、営業時間が月曜日の午後9時から火曜日の午前10時までの場合は機能しません。午後10時は午後9時以降ですが、午前10時前(1日以内)ではありません。したがって、それを覚えておいてください。

ある日付の時刻が他の2つの日付の間にあるかどうかを通知する関数を作成しました(年、月、日は無視されます)。年、月、日のコンポーネントが「中和」された(たとえば、静的な値に設定された)新しいNSDateを提供する2番目のヘルパー関数もあります。

アイデアは、比較が時間のみに依存するように、年、月、日のコンポーネントをすべての日付で同じになるように設定することです。

それが最も効率的なアプローチかどうかはわかりませんが、機能します。

- (NSDate *)dateByNeutralizingDateComponentsOfDate:(NSDate *)originalDate {
    NSCalendar *gregorian = [[[NSCalendar alloc]
                              initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

    // Get the components for this date
    NSDateComponents *components = [gregorian components:  (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate: originalDate];

    // Set the year, month and day to some values (the values are arbitrary)
    [components setYear:2000];
    [components setMonth:1];
    [components setDay:1];

    return [gregorian dateFromComponents:components];
}

- (BOOL)isTimeOfDate:(NSDate *)targetDate betweenStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate {
    if (!targetDate || !startDate || !endDate) {
        return NO;
    }

    // Make sure all the dates have the same date component.
    NSDate *newStartDate = [self dateByNeutralizingDateComponentsOfDate:startDate];
    NSDate *newEndDate = [self dateByNeutralizingDateComponentsOfDate:endDate];
    NSDate *newTargetDate = [self dateByNeutralizingDateComponentsOfDate:targetDate];

    // Compare the target with the start and end dates
    NSComparisonResult compareTargetToStart = [newTargetDate compare:newStartDate];
    NSComparisonResult compareTargetToEnd = [newTargetDate compare:newEndDate];

    return (compareTargetToStart == NSOrderedDescending && compareTargetToEnd == NSOrderedAscending);
}

このコードを使用してテストしました。年、月、日がランダムな値に設定されており、時間チェックに影響を与えないことがわかります。

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyy:MM:dd HH:mm:ss"];

NSDate *openingDate = [dateFormatter dateFromString:@"2012:03:12 12:30:12"];
NSDate *closingDate = [dateFormatter dateFromString:@"1983:11:01 17:12:00"];
NSDate *targetDate = [dateFormatter dateFromString:@"2034:09:24 14:15:54"];

if ([self isTimeOfDate:targetDate betweenStartDate:openingDate andEndDate:closingDate]) {
    NSLog(@"TARGET IS INSIDE!");
}else {
    NSLog(@"TARGET IS NOT INSIDE!");
}
于 2012-10-27T19:13:47.750 に答える