Trừ 7 ngày kể từ ngày hiện tại


117

Có vẻ như tôi không thể trừ 7 ngày từ ngày hiện tại. Đây là cách tôi đang làm:

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 nhận cùng giá trị với ngày hiện tại.

Xin vui lòng giúp đỡ.

CHỈNH SỬA: Trong mã của tôi, tôi đã quên thay thế biến có ngày hiện tại bằng biến đúng. Vì vậy, mã trên là chức năng.


3
[NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)]- Mặc dù nó không xử lý các thay đổi DST.
Hot Licks

Cần làm việc. Nó hoạt động nếu bạn thêm 1 thay vì trừ 7? Làm thế nào để bạn xác định rằng bảyDaysAgo đề cập đến ngày hôm nay?
JeremyP

Câu trả lời:


112

sử dụng phương thức dateByAddingTimeInterval:

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

đầu ra:

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

Hy vọng nó giúp


45
Có những trường hợp phức tạp mà điều này sẽ không hoạt động bình thường, chẳng hạn như nếu mức tiết kiệm ánh sáng ban ngày thay đổi trong bảy ngày được đề cập.
JeremyP

1
Câu trả lời của dymv là cách an toàn hơn để làm điều này.
w3bshark

2
Đây là câu trả lời sai vì những lý do nêu trên, câu trả lời sử dụng dymv của
BarrettJ

1
Trên thực tế điều này có thể được thực hiện đơn giản bằng cách: [now dateByAddingDays:-7]
CrashOverride

Thực hiện kiểu tính toán này rất khó, thích phiên bản của @ Dov hơn.
ctietze

196

mã:

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

đầu ra:

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

Và tôi hoàn toàn đồng ý với JeremyP.

BR.
Eugene


2
Tuy nhiên, có một lỗ hổng bộ nhớ trong câu trả lời này.
atuljangra

132

Nếu bạn đang chạy ít nhất iOS 8 hoặc OS X 10.9, thì còn có một cách dễ dàng hơn:

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

Hoặc, với Swift 2:

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

Và với Swift 3 trở lên, nó thậm chí còn nhỏ gọn hơn:

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

3
Đây phải là câu trả lời được chấp nhận vì nó xử lý tất cả các trường hợp phức tạp cho bạn.
Zhivko Bogdanov

@ZhivkoBogdanov Câu trả lời của tôi đến vài năm sau câu trả lời được chấp nhận và tôi không tin rằng bạn có thể thay đổi câu trả lời được chấp nhận của mình sau khi thực tế.
Dov

Nó là để tham khảo trong tương lai hơn bất cứ điều gì khác.
Zhivko Bogdanov

56

Swift 3

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

3
Không sử dụng NSCalendar, hãy sử dụng Lịch thay thế :)
Jonas

8

Swift 4.2 - Tự thay đổi (Cập nhật)

Đây là một cách khác mà người đăng ban đầu có thể nhận được một tuần trước nếu anh ta đã có biến ngày (cập nhật / tự thay đổi).

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

Sử dụng

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

hoặc là

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

4

câu trả lời của dymv hoạt động tuyệt vời. Điều này bạn có thể sử dụng nhanh chóng

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

Bạn có thể gọi cái này bằng

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

Hy vọng nó sẽ hữu ích và thx để dymv


4

Swift 4.2 iOS 11.x Giải pháp của Babec , Swift thuần túy

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

Tiện ích mở rộng toán tử Swift:

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

Sử dụng

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

3

Phiên bản Swift 3.0+ của câu trả lời được chấp nhận ban đầu

Ngày (). AddTimeInterval (-7 * 24 * 60 * 60)

Tuy nhiên, điều này chỉ sử dụng giá trị tuyệt đối. Sử dụng câu trả lời lịch có lẽ phù hợp hơn trong hầu hết các trường hợp.


-2

Swift 3:

Một sửa đổi cho câu trả lời của Dov.

extension Date {

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

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

Sử dụng:

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

1
Tại sao lại là numberOfDaystùy chọn và sau đó buộc phải mở? Nó không phải là một không tùy chọn Int?
Dov

Đây là cách thích hợp để chứa giá trị tùy chọn trong hàm nhanh.
AG

1
Nhưng tại sao numberOfDays là tùy chọn? Có khi nào ai đó gọi phương thức mở rộng này và không đưa ra số ngày để thêm hoặc bớt không?
Dov

-3

ĐỐI VỚI SWIFT 3.0

đây là fucntion, bạn có thể giảm ngày, tháng, ngày bằng bất kỳ số đếm nào như ví dụ ở đây, tôi đã giảm năm của ngày hệ thống hiện tại đi 100 năm, bạn có thể làm điều đó cho ngày, tháng cũng chỉ cần đặt bộ đếm và lưu trữ nó trong một mảng, bạn có thể mảng này ở bất cứ đâu sau đó 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)
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.