現在の日付から7日を引く


117

現在の日付から7日を引くことができないようです。これは私がそれをやっている方法です:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
[offsetComponents setDay:-7];
NSDate *sevenDaysAgo = [gregorian dateByAddingComponents:offsetComponents toDate:[NSDate date] options:0];

SevenDaysAgoは、現在の日付と同じ値を取得します。

助けてください。

編集:私のコードでは、現在の日付を取得する変数を正しいものに置き換えるのを忘れていました。したがって、上記のコードは機能しています。


3
[NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)]-DSTの変更には対応していません。
ホットリックス

うまくいくはずです。7を引く代わりに1を足しても機能しますか?sevenDaysAgoが今日を参照しているとどのように判断しますか?
JeremyP 2012

回答:


112

dateByAddingTimeIntervalメソッドを使用します。

NSDate *now = [NSDate date];
NSDate *sevenDaysAgo = [now dateByAddingTimeInterval:-7*24*60*60];
NSLog(@"7 days ago: %@", sevenDaysAgo);

出力:

7 days ago: 2012-04-11 11:35:38 +0000

それが役に立てば幸い


45
問題の7日間で夏時間が変更された場合など、これが適切に機能しないエッジケースがあります。
JeremyP 2012

1
dymvの答えは、これを行うためのより安全な方法です。
w3bshark 2013

2
これは前述の理由から間違った答えです。dymvの答えを使用してください
BarrettJ

1
:実はこれは、するだけで行うことができます[now dateByAddingDays:-7]
CrashOverride

この種の計算を行うのは危険です。@ Dovのバージョンをお勧めします。
ctietze 2016

196

コード:

NSDate *currentDate = [NSDate date];
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setDay:-7];
NSDate *sevenDaysAgo = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:currentDate options:0];
NSLog(@"\ncurrentDate: %@\nseven days ago: %@", currentDate, sevenDaysAgo);
[dateComponents release];

出力:

currentDate: 2012-04-22 12:53:45 +0000
seven days ago: 2012-04-15 12:53:45 +0000

そして、私はJeremyPに完全に同意します。

BR。
ユージーン


2
ただし、この回答にはメモリリークがあります。
atuljangra 2014年

132

iOS 8またはOS X 10.9以上を実行している場合は、さらにすっきりした方法があります。

NSDate *sevenDaysAgo = [[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitDay
                                                                value:-7
                                                               toDate:[NSDate date]
                                                              options:0];

または、Swift 2の場合:

let sevenDaysAgo = NSCalendar.currentCalendar().dateByAddingUnit(.Day, value: -7,
    toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))

Swift 3以降ではさらにコンパクトになります:

let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: Date())

3
これは、すべてのエッジケースを処理するため、受け入れられる答えになるはずです。
Zhivko Bogdanov 2016

@ZhivkoBogdanov私の回答は、承認された回答の数年後に届きました。事実の後で、承認された回答を変更できるとは思いません。
Dov

それは何よりも将来の参照用です。
Zhivko Bogdanov 2016

56

スウィフト3

Calendar.current.date(byAdding: .day, value: -7, to: Date())

3
NSCalendarを使用せず、代わりにカレンダーを使用してください:)
Jonas

8

Swift 4.2-自己変更(更新)

元の投稿者が既に日付変数を持っている場合(更新/変更)、元の投稿者が1週間前に取得できる別の方法を次に示します。

extension Date {
    mutating func changeDays(by days: Int) {
        self = Calendar.current.date(byAdding: .day, value: days, to: self)!
    }
}

使用法

var myDate = Date()       // Jan 08, 2019
myDate.changeDays(by: 7)  // Jan 15, 2019
myDate.changeDays(by: 7)  // Jan 22, 2019
myDate.changeDays(by: -1) // Jan 21, 2019

または

// Iterate through one week
for i in 1...7 {
    myDate.changeDays(by: i)
    // Do something
}

4

dymvの答えはすばらしい。これは迅速に使用できます

extension NSDate {    
    static func changeDaysBy(days : Int) -> NSDate {
        let currentDate = NSDate()
        let dateComponents = NSDateComponents()
        dateComponents.day = days
        return NSCalendar.currentCalendar().dateByAddingComponents(dateComponents, toDate: currentDate, options: NSCalendarOptions(rawValue: 0))!
    }
}

あなたはこれを呼び出すことができます

NSDate.changeDaysBy(-7) // Date week earlier
NSDate.changeDaysBy(14) // Date in next two weeks

それが役に立てば幸いです


4

Swift 4.2 iOS 11.x Babecのソリューション、純粋なSwift

extension Date {
  static func changeDaysBy(days : Int) -> Date {
    let currentDate = Date()
    var dateComponents = DateComponents()
    dateComponents.day = days
    return Calendar.current.date(byAdding: dateComponents, to: currentDate)!
  }
}

4

Swiftオペレーター拡張:

extension Date {
    
    static func -(lhs: Date, rhs: Int) -> Date {
        return Calendar.current.date(byAdding: .day, value: -rhs, to: lhs)!
    }
}

使用法

let today = Date()
let yesterday = today - 7

3

元の受け入れられた回答のSwift 3.0+バージョン

Date()。addingTimeInterval(-7 * 24 * 60 * 60)

ただし、これは絶対値のみを使用します。ほとんどの場合、カレンダーの回答を使用する方が適切です。


-2

スウィフト3:

Dovの回答の修正。

extension Date {

    func dateBeforeOrAfterFromToday(numberOfDays :Int?) -> Date {

        let resultDate = Calendar.current.date(byAdding: .day, value: numberOfDays!, to: Date())!
        return resultDate
    }
}

使用法:

let dateBefore =  Date().dateBeforeOrAfterFromToday(numberOfDays : -7)
let dateAfter = Date().dateBeforeOrAfterFromToday(numberOfDays : 7)
print ("dateBefore : \(dateBefore), dateAfter :\(dateAfter)")

1
なぜnumberOfDaysオプションであり、強制的にアンラップされるのですか?それは単なるオプションではIntないでしょうか?
Dov

その迅速な関数にオプションの値を含める適切な方法。
AG

1
しかし、なぜnumberOfDaysがオプションなのですか?誰かがこの拡張メソッドを呼び出して、追加または削除する日数を与えない時間はありますか?
Dov

-3

SWIFT 3.0の場合

ここでは機能、日、月、日をここでのように任意の数だけ減らすことができます。現在のシステム日付の年を100年減らしました。日のためにそれを行うことができ、月もカウンタを設定してそれを保存します配列、この配列はどこでもできますし、func currentTime()

 {

    let date = Date()
    let calendar = Calendar.current
    var year = calendar.component(.year, from: date)
    let month = calendar.component(.month, from: date)
    let  day = calendar.component(.day, from: date)
    let pastyear = year - 100
    var someInts = [Int]()
    printLog(msg: "\(day):\(month):\(year)" )

    for _ in pastyear...year        {
        year -= 1
                     print("\(year) ")
        someInts.append(year)
    }
          print(someInts)
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.