Вопрос по objective-c, ios – Вычесть 7 дней с текущей даты

103

Кажется, я не могу вычесть 7 дней из текущей даты. Вот как я это делаю:

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

SevenDaysAgo получает то же значение, что и текущая дата.

Пожалуйста помоги.

РЕДАКТИРОВАТЬ: В моем коде я забыл заменить переменную, которая получает текущую дату на правильную. Таким образом, приведенный выше код является функциональным.

Это должно сработать. Работает ли это, если вы добавляете 1 вместо 7? Как вы определяете, что sevenDaysAgo относится к сегодняшнему дню? JeremyP
[NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)] - Хотя он не обрабатывает изменения летнего времени. Hot Licks

Ваш Ответ

10   ответов
1
Swift 4.2 - Мутировать (обновить) Self

которым оригинальный постер может получить неделю назад, если у него уже есть переменная даты (обновляется / мутирует сам).

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
}
-2

здесь есть функция, вы можете уменьшить количество дней, месяцев, дней на любое число, например, здесь, я сократил год текущей системной даты на 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)
        }
-2

Изменение ответа Дов.

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)")
Но почему numberOfDays необязательно? есть ли время, когда кто-нибудь вызовет этот метод расширения и не даст количество дней для добавления или удаления? Dov
Это правильный способ содержать необязательное значение в функции swift. A.G
ПочемуnumberOfDays необязательно, а затем принудительно развернут? Разве это не должно быть необязательнымInt? Dov
106

use 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

Надеюсь, это поможе

твет @ dymv - более безопасный способ сделать это. w3bshark
Делать такие расчеты - опасные люди, предпочитаю версию Дова. ctietze
На самом деле это можно сделать просто:[now dateByAddingDays:-7] CrashOverride
Существуют крайние случаи, когда это не будет работать должным образом, например, если переход на летнее время меняется в течение рассматриваемых семи дней. JeremyP
Это неправильный ответ по вышеупомянутым причинам, используйте ответ dymv BarrettJ
185

код

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

И я полностью согласен с ДжеремиП.

BR.
Евгений

В этом ответе есть утечка памяти. atuljangra
36
Свифт 3
Calendar.current.date(byAdding: .day, value: -7, to: Date())
Не используйте NSCalendar, вместо этого используйте Календарь Jonas
4

твет @ dymv отлично работает. Это вы можете использовать в Swift

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

Надеюсь, это поможет и спасибо Dymv

111

есть еще более чистый способ:

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())
@ ZhivkoBogdanov Мой ответ пришел через несколько лет после принятого ответа, и я не верю, что вы можете изменить принятый ответ после факта. Dov
Это больше на будущее, чем что-либо еще. Zhivko Bogdanov
Это должен быть принятый ответ, поскольку он обрабатывает все крайние случаи для вас. Zhivko Bogdanov
3

Swift 4.2 iOS 11.x Babec @ решение, чистый Свифт

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

Date (). AddTimeInterval (-7 * 24 * 60 * 60)

Однако при этом используются только абсолютные значения. Использование календарных ответов, вероятно, более подходит в большинстве случаев.

Похожие вопросы