1. ホーム
  2. ios

[解決済み] 2つのNSDates間の日数[重複]。

2022-04-27 17:59:49

質問

の間の日数を決定するにはどうすればよいですか? NSDate の値は(時間も考慮して)どうなっているのでしょうか?

NSDate の値は、どのような形式であれ [NSDate date] が取る。

具体的には、私のiPhoneアプリでユーザーがinactiveの状態になったとき、以下のような値を保存しています。

exitDate = [NSDate date];

そして、彼らがアプリを開き直すと、現在の時刻が表示されるんだ。

NSDate *now = [NSDate date];

では、次のように実装してみたいと思います。

-(int)numberOfDaysBetweenStartDate:exitDate andEndDate:now

解決方法は?

以下は、2つの日付の間のカレンダーの日数を決定するために私が使用した実装です。

+ (NSInteger)daysBetweenDate:(NSDate*)fromDateTime andDate:(NSDate*)toDateTime
{
    NSDate *fromDate;
    NSDate *toDate;

    NSCalendar *calendar = [NSCalendar currentCalendar];

    [calendar rangeOfUnit:NSCalendarUnitDay startDate:&fromDate
        interval:NULL forDate:fromDateTime];
    [calendar rangeOfUnit:NSCalendarUnitDay startDate:&toDate
        interval:NULL forDate:toDateTime];

    NSDateComponents *difference = [calendar components:NSCalendarUnitDay
        fromDate:fromDate toDate:toDate options:0];

    return [difference day];
}

EDITです。

上記の素晴らしい解決策を、以下のSwiftバージョンで拡張しています。 NSDate :

extension NSDate {
  func numberOfDaysUntilDateTime(toDateTime: NSDate, inTimeZone timeZone: NSTimeZone? = nil) -> Int {
    let calendar = NSCalendar.currentCalendar()
    if let timeZone = timeZone {
      calendar.timeZone = timeZone
    }

    var fromDate: NSDate?, toDate: NSDate?

    calendar.rangeOfUnit(.Day, startDate: &fromDate, interval: nil, forDate: self)
    calendar.rangeOfUnit(.Day, startDate: &toDate, interval: nil, forDate: toDateTime)

    let difference = calendar.components(.Day, fromDate: fromDate!, toDate: toDate!, options: [])
    return difference.day
  }
}

使用状況に応じて削除することができます。

上記の解決策は、現在のタイムゾーン以外のタイムゾーンに対しても有効で、世界中の場所の情報を表示するアプリに最適です。