현재 날짜에서 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

작동합니다. 7을 빼는 대신 1을 더하면 작동합니까? sevenDaysAgo가 오늘을 가리키는 지 어떻게 결정합니까?
JeremyP apr

답변:


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
예를 들어 해당 7 일 동안 일광 절약 시간이 변경되는 경우와 같이 제대로 작동하지 않는 경우가 있습니다.
JeremyP

1
dymv의 대답은 더 안전한 방법입니다.
w3bshark 2013 년

2
이것은 상기 이유에 대한 잘못된 답변입니다, 사용 dymv의 대답
BarrettJ

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 2016

@ZhivkoBogdanov 내 대답은 수락 된 답변 후 몇 년 후에 왔으며 사실 후에 수락 된 답변을 변경할 수 있다고 생각하지 않습니다.
Dov

다른 무엇보다 향후 참조 용으로 사용됩니다.
Zhivko Bogdanov

56

스위프트 3

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

3
NSCalendar를 사용하지 말고 대신 Calendar를 사용하세요. :)
Jonas

8

Swift 4.2-Mutate (업데이트) Self

다음은 원래 포스터가 이미 날짜 변수 (업데이트 / 변형)가있는 경우 1 주일 전에 가져올 수있는 또 다른 방법입니다.

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+ 버전

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

신속한 기능에 선택적 값을 포함하는 적절한 방법입니다.
AG

1
그러나 numberOfDays가 선택 사항 인 이유는 무엇입니까? 누군가가이 확장 메서드를 호출하고 추가하거나 제거 할 일 수를주지 않을 때가 있습니까?
Dov

-3

SWIFT 3.0 용

여기에 fucntion이 있습니다. 예를 들어 여기와 같이 일, 월, 일을 줄일 수 있습니다. 예를 들어 여기에서 현재 시스템 날짜의 연도를 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)
        }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.