Відняти 7 днів від поточної дати


119

Здається, я не можу відняти 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 отримує те саме значення, що і поточна дата.

Будь ласка, допоможіть.

EDIT: У своєму коді я забув замінити змінну, яка отримує поточну дату, правильною. Отже, вище код функціональний.


3
[NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)]- Хоча він не обробляє зміни DST.
Гарячі лизи

Це має спрацювати. Чи працює, якщо ви додаєте 1 замість віднімання 7? Як ви визначите, що сьогодні відноситься сім день?
JeremyP

Відповіді:


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
Є випадкові випадки, коли це не працює належним чином, наприклад, якщо літній час змінюється протягом семи днів.
JeremyP

1
відповідь dymv - це безпечніший спосіб зробити це.
w3bshark

2
Це неправильна відповідь з вищезазначених причин, використовуйте відповідь
dymv

1
Насправді це можна зробити просто:[now dateByAddingDays:-7]
CrashOverride

Робити такий обчислення небезпечно, віддайте перевагу версії @ Dov.
ctietze

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

133

Якщо ви працюєте принаймні з 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
Це має бути прийнятою відповіддю, оскільки вона обробляє всі кращі справи для вас.
Живко Богданов

@ZhivkoBogdanov Моя відповідь надійшла через кілька років після прийнятої відповіді, і я не вірю, що ви можете змінити свою прийняту відповідь після факту.
Дов

Це більше для подальшого використання, ніж будь-що інше.
Живко Богданов

56

Швидкий 3

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

3
Не використовуйте NSCalendar, а замість цього використовуйте Календар :)
Jonas

8

Swift 4.2 - Самозапромінення (оновлення)

Ось ще один спосіб, коли оригінальний плакат може отримати тиждень тому, якщо у нього вже є змінна дата (сама оновлення / вимкнення).

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

Сподіваюсь, це допомагає і thx для димв


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+ версія оригінальної прийнятої відповіді

Дата (). ДодаванняTimeInterval (-7 * 24 * 60 * 60)

Однак для цього використовуються лише абсолютні значення. Використовувати відповіді календаря, мабуть, більш підходить у більшості випадків.


-2

Швидкий 3:

Модифікація відповіді Дова.

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?
Дов

Це правильний спосіб містити необов'язкове значення у швидкій функції.
AG

1
Але чому номер номерOfDays необов’язковий? чи є час, коли хтось зателефонує до цього методу розширення та не надасть кількість днів для додавання чи видалення?
Дов.

-3

ДЛЯ SWIFT 3.0

ось fucntion, ви можете скоротити дні, місяць, день на будь-який рахунок, як, наприклад, тут, я скоротив рік поточної дати системи на 100 років, ви можете це робити день, місяць, також просто встановіть лічильник і зберігайте його в масив, ви можете використовувати цей масив будь-де, тоді функціонувати 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)
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.