Kurangi 7 hari dari tanggal sekarang

119

Sepertinya saya tidak bisa mengurangi 7 hari dari tanggal sekarang. Beginilah cara saya melakukannya:

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 mendapatkan nilai yang sama dengan tanggal saat ini.

Tolong bantu.

EDIT: Dalam kode saya, saya lupa mengganti variabel yang mendapatkan tanggal sekarang dengan yang benar. Jadi kode di atas berfungsi.

Alex Tau
sumber
3
[NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)]- Meskipun tidak menangani perubahan DST.
Hot Licks
Seharusnya itu berhasil. Apakah berhasil jika Anda menambahkan 1, bukan mengurangi 7? Bagaimana Anda menentukan bahwa sevenDaysAgo mengacu pada hari ini?
JeremyP

Jawaban:

112

gunakan metode dateByAddingTimeInterval:

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

keluaran:

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

Semoga membantu

Novarg
sumber
45
Ada kasus tepi di mana ini tidak akan berfungsi dengan baik, misalnya jika penghematan siang hari berubah selama tujuh hari tersebut.
JeremyP
1
jawaban dymv adalah cara yang lebih aman untuk melakukan ini.
w3bshark
2
Ini adalah jawaban yang salah untuk alasan yang disebutkan di atas, gunakan jawaban
dymv
1
Sebenarnya ini dapat dilakukan hanya dengan:[now dateByAddingDays:-7]
CrashOverride
Melakukan kalkulasi semacam ini berbahaya, lebih suka versi @ Dov.
ctietze
196

kode:

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

keluaran:

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

Dan saya sepenuhnya setuju dengan JeremyP.

BR.
Eugene

dymv
sumber
2
Ada kebocoran memori dalam jawaban ini.
atuljangra
133

Jika Anda menjalankan setidaknya iOS 8 atau OS X 10.9, ada cara yang lebih bersih:

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

Atau, dengan Swift 2:

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

Dan dengan Swift 3 dan yang lebih baru, itu menjadi lebih kompak:

let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: Date())
Dov
sumber
3
Ini harus menjadi jawaban yang diterima karena menangani semua kasus tepi untuk Anda.
Zhivko Bogdanov
@ZhivkoBogdanov Jawaban saya muncul beberapa tahun setelah jawaban diterima, dan saya tidak yakin Anda dapat mengubah jawaban yang diterima setelah fakta.
Dov
Ini lebih untuk referensi di masa depan daripada apa pun.
Zhivko Bogdanov
56

Cepat 3

Calendar.current.date(byAdding: .day, value: -7, to: Date())
Marckaraujo
sumber
3
Jangan gunakan NSCalendar, gunakan Kalender sebagai gantinya :)
Jonas
8

Swift 4.2 - Mutate (Update) Self

Berikut adalah cara lain yang bisa didapat poster asli satu minggu yang lalu jika dia sudah memiliki variabel tanggal (pembaruan / mutasi sendiri).

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

Pemakaian

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

atau

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

Jawaban dymv bekerja dengan baik. Ini bisa Anda gunakan dengan cepat

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

Anda bisa menyebutnya dengan

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

Semoga membantu dan terima kasih untuk dymv

Babac
sumber
4

Solusi Swift 4.2 iOS 11.x Babec , Swift murni

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)!
  }
}
pengguna3069232
sumber
4

Ekstensi operator cepat:

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

Pemakaian

let today = Date()
let yesterday = today - 7
Sam
sumber
3

Versi Swift 3.0+ dari jawaban asli yang diterima

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

Namun, ini hanya menggunakan nilai absolut. Gunakan jawaban kalender mungkin lebih cocok dalam banyak kasus.

mitos asli
sumber
-2

Cepat 3:

Modifikasi jawaban Dov.

extension Date {

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

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

Pemakaian:

let dateBefore =  Date().dateBeforeOrAfterFromToday(numberOfDays : -7)
let dateAfter = Date().dateBeforeOrAfterFromToday(numberOfDays : 7)
print ("dateBefore : \(dateBefore), dateAfter :\(dateAfter)")
AG
sumber
1
Mengapa numberOfDaysopsional dan kemudian dibuka paksa? Bukankah seharusnya itu hanya menjadi non-opsional Int?
Dov
Ini adalah cara yang tepat untuk memuat nilai opsional dalam fungsi cepat.
AG
1
Tetapi mengapa numberOfDays opsional? adakah waktu ketika seseorang akan memanggil metode ekstensi ini dan tidak memberikan jumlah hari untuk menambahkan atau menghapus?
Dov
-3

UNTUK SWIFT 3.0

di sini adalah fucntion, Anda dapat mengurangi hari, bulan, hari dengan hitungan apa pun seperti misalnya di sini, saya telah mengurangi tahun tanggal sistem saat ini dengan 100 tahun, Anda dapat melakukannya untuk hari, bulan juga hanya mengatur penghitung dan menyimpannya di array, Anda dapat array ini di mana saja kemudian 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)
        }
aditya panse
sumber