Вычесть 7 дней с текущей даты
Кажется, что я не могу вычесть 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: В моем коде я забыл заменить переменную, которая получает текущую дату с правильным. Таким образом, над кодом функционально.
Ответы
Ответ 1
использовать метод 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
Надеюсь, что это поможет
Ответ 2
код:
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.
Евгений
Ответ 3
Если вы используете хотя бы 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())
Ответ 4
Swift 3
Calendar.current.date(byAdding: .day, value: -7, to: Date())
Ответ 5
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
Надеюсь, что это поможет, а спасибо - dymv
Ответ 6
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)!
}
}
Ответ 7
Swift 3.0
let date = Date() - 7 * 24 * 60 * 60
Ответ 8
Swift 4.2 - Mutate (обновление) 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
}
Ответ 9
Swift 3. 0+ версия оригинального принятого ответа
Date(). Добавление TimeInterval (-7 * 24 * 60 * 60)
Однако для этого используются только абсолютные значения. Использование календаря ответов, вероятно, более подходит в большинстве случаев.
Ответ 10
ДЛЯ SWIFT 3.0
здесь есть fucntion, вы можете сократить дни, месяц, день на любой счет
например, здесь, я сократил текущий год системы на 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)
}
Ответ 11
Swift 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)")