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.


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


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


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())

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())

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
}

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


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

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

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.


-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)")

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)
        }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.