Geçerli tarihten 7 günü çıkarın


119

Görünüşe göre şu anki tarihten 7 günü çıkaramıyorum. Ben böyle yapıyorum:

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, geçerli tarihle aynı değeri alır.

Lütfen yardım et.

DÜZENLEME: Kodumda, geçerli tarihi alan değişkeni doğru olanla değiştirmeyi unuttum. Yani yukarıdaki kod işlevseldir.


3
[NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)]- DST değişikliklerini yönetmese de.
Hot Licks

Bu çalışmalı. 7 çıkarmak yerine 1 eklerseniz işe yarıyor mu? SevenDaysAgo'nun bugün ile ilgili olduğunu nasıl anlarsınız?
JeremyP

Yanıtlar:


112

dateByAddingTimeInterval yöntemini kullanın:

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

çıktı:

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

Umarım yardımcı olur


45
Bunun düzgün çalışmadığı uç durumlar vardır, örneğin gün ışığından yararlanma söz konusu yedi gün boyunca değişirse.
JeremyP

1
dymv'nin cevabı bunu yapmanın daha güvenli yoludur.
w3bshark

2
Bu yukarıda belirtilen nedenlerden dolayı yanlış cevap, dymv'nin cevabını kullanın
BarrettJ

1
Aslında bu basitçe şu şekilde yapılabilir:[now dateByAddingDays:-7]
CrashOverride

Bu tür bir hesaplama yapmak tehlikelidir, @ Dov'un sürümünü tercih edin.
ctietze

196

kod:

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];

çıktı:

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

Ve JeremyP'ye tamamen katılıyorum.

BR.
Eugene


2
Yine de bu cevapta bir hafıza sızıntısı var.
atuljangra

133

En az iOS 8 veya OS X 10.9 kullanıyorsanız, daha da basit bir yol var:

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

Veya Swift 2 ile:

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

Swift 3 ve üstü ile daha da kompakt hale geliyor:

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

3
Sizin için tüm uç durumları ele aldığı için bu kabul edilen cevap olmalıdır.
Zhivko Bogdanov

@ZhivkoBogdanov Cevabım, kabul edilen cevaptan birkaç yıl sonra geldi ve kabul edilen cevabınızı gerçeğin ardından değiştirebileceğinize inanmıyorum.
Dov

Her şeyden çok gelecekteki referans için.
Zhivko Bogdanov

57

Hızlı 3

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

3
NSCalendar'ı kullanmayın, bunun yerine Takvim'i kullanın :)
Jonas

8

Swift 4.2 - Mutate (Update) Self

Orijinal gönderenin zaten bir tarih değişkeni varsa (kendini günceller / değiştirir) bir hafta önce alabileceği başka bir yol.

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

kullanım

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

veya

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

4

dymv'nin cevabı harika çalışıyor. Bu, hızlı bir şekilde kullanabilirsiniz

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))!
    }
}

Bunu ile arayabilirsin

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

Umarım yardımcı olur ve dymv için teşekkürler


4

Swift 4.2 iOS 11.x Babec'in çözümü, saf 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 operatör uzantısı:

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

kullanım

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

3

Kabul edilen orijinal cevabın Swift 3.0+ versiyonu

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

Ancak, bu yalnızca mutlak değerleri kullanır. Çoğu durumda takvim yanıtlarını kullanma muhtemelen daha uygundur.


-2

Swift 3:

Dov'un cevabında bir değişiklik.

extension Date {

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

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

Kullanımı:

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

1
Neden numberOfDaysisteğe bağlı ve sonra zorla açılmamış? Sadece isteğe bağlı olmaması gerekmez Intmi?
Dov

Swift işlevinde isteğe bağlı değeri içermenin doğru yolu.
AG

1
Peki numberOfDays neden isteğe bağlıdır? Birinin bu dahili hat yöntemini arayacağı ve eklemek veya çıkarmak için birkaç gün vermediği herhangi bir zaman var mı?
Dov

-3

SWIFT 3.0 İÇİN

işte fucntion, örneğin burada olduğu gibi herhangi bir sayı ile günleri, ayı, günü azaltabilirsiniz, mevcut sistem tarihinin yılını 100 yıl azalttım, bunu gün, ay için de yapabilirsiniz, ayrıca sadece sayacı ayarlayın ve dizi, bu diziyi herhangi bir yerden sonra currentTime () işlevini kullanabilirsiniz.

 {

    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)
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.