从当前日期减去7天


117

看来我无法从当前日期减去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 2012年

那应该工作。如果您将数字加1而不是减去7,是否可行?您如何确定sevenDaysAgo是指今天?
JeremyP

Answers:


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的答案
BarrettJ 2014年

1
实际上,这可以通过以下方式简单地完成:[now dateByAddingDays:-7]
CrashOverride 2015年

进行这种计算很危险,请使用@Dov版本。
ctietze '16

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 2014年

132

如果您至少运行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我的答案是在接受答案后的几年,我不相信您可以在事实之后更改您的接受答案。
2013年

它比其他任何东西都更适合将来参考。
Zhivko Bogdanov

56

迅捷3

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

3
不要使用NSCalendar,请改用Calendar :)
Jonas

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

Swift运算子扩展:

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+版本

Date()。addingTimeInterval(-7 * 24 * 60 * 60)

但是,这仅使用绝对值。在大多数情况下,使用日历答案可能更合适。


-2

斯威夫特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

在swift函数中包含可选值的正确方法。
AG

1
但是为什么numberOfDays是可选的?有人会在什么时候调用此扩展方法,而又不给他们几天添加或删除的时间吗?
2013年

-3

对于SWIFT 3.0

这是功能,您可以将天,月,日减少任意数量,例如此处,我将当前系统日期的年份减少了100年,您可以将天,月减少,也可以设置计数器并将其存储在array,您可以在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)
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.