7

2日間のNSDateオブジェクトを比較しようとしています。最初に、NSDateComponentsを使用して2つの日付オブジェクトの差を計算しましたが、正しく機能しています。

    NSString *dateStr =@"2012-11-05 15:00:00";
    NSDate *date = [dateFormat dateFromString:dateStr];
    NSDateComponents *datesDiff = [calendar components: NSDayCalendarUnit
                                              fromDate: date
                                                toDate: [NSDate date]
                                               options: 0];

それは私の問題を解決しません。実際、date1 =2012-11-0523:00:00およびdate2=2012-11-06 10:00:00の場合、2つの日付の差は0日と11時間です。日の変化を検出できるものを探しています。つまり、date1 =2012-11-0523:00:00およびdate2=2012-11-06 00:01:00の場合、1日の違いがあります。

誰かがその解決策を知っているなら、私は彼の提案を歓迎します。前もって感謝します

4

4 に答える 4

19

私はあなたがこれを探していると思います(日付と時刻のプログラミングガイドから):

リスト132つの日付の間の日数(間の真夜中の数として)

@implementation NSCalendar (MySpecialCalculations)

-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate
{
     NSInteger startDay=[self ordinalityOfUnit:NSDayCalendarUnit
          inUnit: NSEraCalendarUnit forDate:startDate];
     NSInteger endDay=[self ordinalityOfUnit:NSDayCalendarUnit
          inUnit: NSEraCalendarUnit forDate:endDate];
     return endDay-startDay;
}
@end

編集:Swiftバージョン:

extension NSCalendar {
    func daysWithinEraFromDate(startDate: NSDate, endDate: NSDate) -> Int {
        let startDay = self.ordinalityOfUnit(.Day, inUnit: NSCalendarUnit.Era, forDate: startDate)
        let endDay = self.ordinalityOfUnit(.Day, inUnit: NSCalendarUnit.Era, forDate: endDate)
        return endDay - startDay
    }
}
于 2012-11-05T18:18:47.963 に答える
6
NSString *start = @"2010-09-01";
NSString *end = @"2010-12-01";

NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd"];
NSDate *startDate = [f dateFromString:start];
NSDate *endDate = [f dateFromString:end];
[f release];

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [gregorianCalendar components:NSDayCalendarUnit
                                                    fromDate:startDate
                                                      toDate:endDate
                                                     options:0];
[gregorianCalendar release];

コンポーネントが違いを保持するようになりました。

NSLog(@"%ld", [components day]);
于 2013-07-04T07:55:30.727 に答える
0
func daysBetweenDates(startDate: NSDate, endDate: NSDate) -> Int
{
    let calendar = NSCalendar.currentCalendar()

    let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: [])

    return components.day
}

また

let calendar = NSCalendar.currentCalendar();
let component1 = calendar.component(.Day, fromDate: fromDate)
let component2 = calendar.component(.Day, fromDate: toDate)
let difference  = component1 - component2
于 2016-07-01T06:39:58.790 に答える
0

Swift 3の場合:

@masaの答えから拡張:

extension Calendar {
    func daysWithinEraFromDate(startDate: Date, endDate: Date) -> Int? {
        guard let startDay = ordinality(of: .day, in: .era, for: startDate) else {
            return nil
        }

        guard let endDay = ordinality(of: .day, in: .era, for: endDate) else {
            return nil
        }

        return endDay - startDay
    }
}
于 2017-03-09T15:38:41.663 に答える