ลบ 7 วันจากวันที่ปัจจุบัน


119

ดูเหมือนว่าจะลบ 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 ได้รับค่าเดียวกับวันที่ปัจจุบัน

กรุณาช่วย.

แก้ไข: ในรหัสของฉันฉันลืมแทนที่ตัวแปรที่รับวันที่ปัจจุบันด้วยวันที่ถูกต้อง ดังนั้นโค้ดด้านบนจึงใช้งานได้


3
[NSDate dateWithTimeIntervalSinceReferenceDate:[NSDate date].timeIntervalSinceReferenceDate - (7*24*60*60)]- แม้ว่าจะไม่รองรับการเปลี่ยนแปลง DST
Hot Licks

ที่ควรจะทำงาน ได้ผลไหมถ้าคุณบวก 1 แทนที่จะลบ 7? คุณทราบได้อย่างไรว่าวันนี้ sevenDaysAgo อ้างถึง?
JeremyP

คำตอบ:


112

ใช้วิธี 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

หวังว่าจะช่วยได้


45
มีหลายกรณีที่ทำให้การดำเนินการนี้ทำงานไม่ถูกต้องเช่นหากการออมแสงเปลี่ยนแปลงในช่วงเจ็ดวันที่เป็นปัญหา
JeremyP

1
คำตอบของ dymv คือวิธีที่ปลอดภัยกว่าในการทำเช่นนี้
w3bshark

2
นี่เป็นคำตอบที่ไม่ถูกต้องด้วยเหตุผลข้างต้นใช้คำตอบของ
dymv

1
จริงๆแล้วสามารถทำได้ง่ายๆโดย:[now dateByAddingDays:-7]
CrashOverride

การคำนวณแบบนี้เป็นอันตรายคุณชอบเวอร์ชันของ @ Dov
ctietze

196

รหัส:

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
ยูจีน


2
คำตอบนี้มีหน่วยความจำรั่วไหล
atuljangra

133

หากคุณใช้งาน 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())

3
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากจัดการกับขอบข่ายทั้งหมดสำหรับคุณ
Zhivko Bogdanov

@ZhivkoBogdanov คำตอบของฉันเกิดขึ้นไม่กี่ปีหลังจากคำตอบที่ได้รับการยอมรับและฉันไม่เชื่อว่าคุณจะสามารถเปลี่ยนคำตอบที่ยอมรับได้หลังจากข้อเท็จจริง
Dov

เป็นข้อมูลอ้างอิงในอนาคตมากกว่าสิ่งอื่นใด
Zhivko Bogdanov


8

Swift 4.2 - กลายพันธุ์ (อัปเดต) ด้วยตัวเอง

นี่เป็นอีกวิธีหนึ่งที่ผู้โพสต์ต้นฉบับจะได้รับเมื่อหนึ่งสัปดาห์ก่อนหากเขามีตัวแปรวันที่อยู่แล้ว (อัปเดต / กลายพันธุ์เอง)

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
}

4

คำตอบของ 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


4

โซลูชันของ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)!
  }
}

4

ส่วนขยายตัวดำเนินการอย่างรวดเร็ว:

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

การใช้

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

3

คำตอบเดิมที่ยอมรับเวอร์ชัน Swift 3.0+

วันที่ (). addedTimeInterval (-7 * 24 * 60 * 60)

อย่างไรก็ตามสิ่งนี้ใช้ค่าสัมบูรณ์เท่านั้น คำตอบในปฏิทินน่าจะเหมาะสมกว่าในกรณีส่วนใหญ่


-2

Swift 3:

การปรับเปลี่ยนคำตอบของ Dov

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

1
เหตุใดจึงเป็นnumberOfDaysทางเลือกและบังคับให้คลายออก มันควรจะเป็นทางเลือกไม่ใช่Intหรือ?
Dov

เป็นวิธีที่เหมาะสมในการบรรจุค่าทางเลือกในฟังก์ชันที่รวดเร็ว
AG

1
แต่เหตุใด numberOfDays จึงเป็นทางเลือก? มีเวลาใดบ้างที่จะมีคนเรียกวิธีการขยายนี้และไม่ให้เวลาเพิ่มหรือนำออกเป็นจำนวนวัน?
Dov

-3

สำหรับ 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)
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.