NSDate에 하루를 어떻게 추가합니까?


320

제목에서 알 수 있듯이 기본적으로 에 1 일을 추가 할 수있는 방법이 궁금합니다 NSDate.

만약 그렇다면 :

21st February 2011

그것은 될 것입니다 :

22nd February 2011

또는 다음과 같은 경우 :

31st December 2011

그것은 될 것입니다 :

1st January 2012.

4
NSDate는 날짜를 나타내지 않으며 특정 시점을 나타냅니다. 따라서 날짜와 시간이 포함됩니다.
Rog

4
동의 함-아래에서 Zack German의 답변을 사용해야합니다. Apple의 날짜 및 시간 프로그래밍 안내서를 참조하십시오 .
Ash Furrow

더 새롭고 더 짧은 솔루션을 보려면 아래로 스크롤하십시오!
catanore

답변:


711

스위프트 5.0 :

var dayComponent    = DateComponents()
dayComponent.day    = 1 // For removing one day (yesterday): -1
let theCalendar     = Calendar.current
let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
print("nextDate : \(nextDate)")

목표 C :

NSDateComponents *dayComponent = [[NSDateComponents alloc] init];
dayComponent.day = 1;

NSCalendar *theCalendar = [NSCalendar currentCalendar];
NSDate *nextDate = [theCalendar dateByAddingComponents:dayComponent toDate:[NSDate date] options:0];

NSLog(@"nextDate: %@ ...", nextDate);

이것은 설명이 필요합니다.


19
음수 성분을 사용하여 날짜에서 뺄 수도 있습니다.
DataGraham

58
선택된 답변보다 훨씬 더 나은 솔루션
Justin Meiners

19
하루 분의 초를 추가하지 않고 Date 구성 요소를 사용하는 경우 +1입니다.
Abizern

예는 일광 절약에 적합합니다. DST 검사를위한 팁 : Mac에서 날짜 및 시간을 재설정 한 다음 시뮬레이터를 다시 시작하면 시스템 시간이 따라갑니다.
Rob van den Berg

2
Swift에서는 dateByAddingComponents 호출 의 마지막 매개 변수 를NSCalendarOptions(rawValue: 0)
gfpacheco

270

iOS 8부터 사용할 수 있습니다 NSCalendar.dateByAddingUnit

Swift 1.x의 예 :

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar()
    .dateByAddingUnit(
         .CalendarUnitDay, 
         value: 1, 
         toDate: today, 
         options: NSCalendarOptions(0)
    )

스위프트 2.0 :

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar()
    .dateByAddingUnit(
        .Day, 
        value: 1, 
        toDate: today, 
        options: []
    )

스위프트 3.0 :

let today = Date()
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: today)

5
그것은 단지 나입니까, 아니면 Swift가 무언가를 내장하는 것이 훨씬 간단하지 date.add(.days, 1)않습니까? * 확장되어 확장을 구축합니다
15:47의

2
@quemeful extension Date { func adding(_ component: Calendar.Component, _ value: Int) -> Date? { return Calendar.current.date(byAdding: component, value: value, to: self) } }사용법Date().adding(.day, 1) // "Jun 6, 2019 at 5:35 PM"
Leo

82

스위프트 5 업데이트

let today = Date()
let nextDate = Calendar.current.date(byAdding: .day, value: 1, to: today)

목표 C

 NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
 // now build a NSDate object for the next day
 NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
 [offsetComponents setDay:1];
 NSDate *nextDate = [gregorian dateByAddingComponents:offsetComponents toDate: [NSDate date] options:0];

34

iOS 8 이상, OSX 10.9 이상, Objective-C

NSCalendar *cal = [NSCalendar currentCalendar];    
NSDate *tomorrow = [cal dateByAddingUnit:NSCalendarUnitDay 
                                   value:1 
                                  toDate:[NSDate date] 
                                 options:0];

여기서는 장치를 마스킹 할 수 없습니다 (하나만 사용하십시오).
catanore

31

highmaintenance의 답변과 vikingosegundo의 의견을 기반으로 작동하는 Swift 3 이상 구현 . 이 날짜 확장에는 연도, 월 및 시간을 변경하는 추가 옵션도 있습니다.

extension Date {

    /// Returns a Date with the specified amount of components added to the one it is called with
    func add(years: Int = 0, months: Int = 0, days: Int = 0, hours: Int = 0, minutes: Int = 0, seconds: Int = 0) -> Date? {
        let components = DateComponents(year: years, month: months, day: days, hour: hours, minute: minutes, second: seconds)
        return Calendar.current.date(byAdding: components, to: self)
    }

    /// Returns a Date with the specified amount of components subtracted from the one it is called with
    func subtract(years: Int = 0, months: Int = 0, days: Int = 0, hours: Int = 0, minutes: Int = 0, seconds: Int = 0) -> Date? {
        return add(years: -years, months: -months, days: -days, hours: -hours, minutes: -minutes, seconds: -seconds)
    }

}

OP의 요청에 따라 하루를 추가하는 용도는 다음과 같습니다.

let today = Date() // date is then today for this example
let tomorrow = today.add(days: 1)

2
날짜 구성 요소를 사용하여 코드를 크게 줄일 수 있습니다.
vikingosegundo

내 의견으로는 단점이 있지만 옳습니다. 확장자를 사용하는 코드가 깨끗하지 않습니다- let foo = Date().add([.calendar: 1, .yearForWeekOfYear: 3] 대안 솔루션을 내 대답에 추가하는 것처럼 거의 의미가없는 구성 요소가있는 불필요한 옵션을 엽니 다 . . 귀하의 제안에 감사드립니다, @vikingosegundo!
Benno Kress

3
글쎄, 나는 실제로 다른 것을 의미했다 : gist.github.com/vikingosegundo/31ddb14920415ef444a9ab550411d4ff
vikingosegundo


13

아래 함수를 사용하고 days 매개 변수를 사용하여 days daysAhead / daysBehind 매개 변수를 사용하여 미래 날짜에 대해 양수 또는 이전 날짜에 대해 음수로 매개 변수를 전달하십시오.

+ (NSDate *) getDate:(NSDate *)fromDate daysAhead:(NSUInteger)days
{
    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    dateComponents.day = days;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *previousDate = [calendar dateByAddingComponents:dateComponents
                                                     toDate:fromDate
                                                    options:0];
    [dateComponents release];
    return previousDate;
}

10

신속하게

var dayComponenet = NSDateComponents()
dayComponenet.day = 1

var theCalendar = NSCalendar.currentCalendar()
var nextDate = theCalendar.dateByAddingComponents(dayComponenet, toDate: NSDate(), options: nil)

8

일이야!

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSCalendarUnit unit = NSCalendarUnitDay;
    NSInteger value = 1;
    NSDate *today = [NSDate date];
    NSDate *tomorrow = [calendar dateByAddingUnit:unit value:value toDate:today options:NSCalendarMatchStrictly];

분명히이 질문은 코드 덤프 천국입니다. 따라서 당신을 독려 할 이유가 없습니다.
Drew

2
NSCalendarWrapComponents (0) 옵션을 사용하면 현재 월 범위에서만 날짜를 만들 수 있기 때문에 내 대답이 더 정확합니다. NSCalendarWrapComponents를 사용하여 2016 년 1 월 31 일에 1 일을 추가하면 2016 년 1 월 1 일을 받게됩니다. NSCalendarMatchStrictly 옵션을 사용하면 다음 달력 날짜가 표시됩니다.
DenZhukov

8

Swift 3.0의 매우 간단한 구현은 다음과 같습니다.

func dateByAddingDays(inDays: Int) -> Date {
    let today = Date()
    return Calendar.current.date(byAdding: .day, value: inDays, to: today)!
}

5
NSDate *today=[NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *components=[[NSDateComponents alloc] init];
components.day=1;
NSDate *targetDate =[calendar dateByAddingComponents:components toDate:today options: 0];

5

스위프트 4.0

extension Date {
    func add(_ unit: Calendar.Component, value: Int) -> Date? {
        return Calendar.current.date(byAdding: unit, value: value, to: self)
    }
}

용법

date.add(.day, 3)!   // adds 3 days
date.add(.day, -14)!   // subtracts 14 days

참고 : 코드 줄이 느낌표로 끝나는 이유를 모르는 경우 Google에서 "Swift Optionals"를 찾으십시오.


3

당신은있는 NSDate의 방법을 사용할 수 있습니다 - (id)dateByAddingTimeInterval:(NSTimeInterval)secondsseconds이 될 것입니다60 * 60 * 24 = 86400


3
NSDate의 addByTimeInterval은 iOS 4에서 더 이상 사용되지 않습니다 ( bit.ly/vtOzvU ). 대신 dateByAddingTimeInterval ( bit.ly/vRkFrN )을 사용하십시오.
billmaya

4
일광 절약 시간 제로 인해 23, 24 또는 25 시간이 소요될 수 있습니다.
vikingosegundo

3

Swift 2.1.1 및 xcode 7.1 OSX 10.10.5에서는 함수를 사용하여 앞뒤로 며칠을 추가 할 수 있습니다

func addDaystoGivenDate(baseDate:NSDate,NumberOfDaysToAdd:Int)->NSDate
{
    let dateComponents = NSDateComponents()
    let CurrentCalendar = NSCalendar.currentCalendar()
    let CalendarOption = NSCalendarOptions()

    dateComponents.day = NumberOfDaysToAdd

    let newDate = CurrentCalendar.dateByAddingComponents(dateComponents, toDate: baseDate, options: CalendarOption)
    return newDate!
}

현재 날짜를 9 일씩 늘리기위한 함수 호출

var newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: 9)
print(newDate)

현재 날짜를 80 일 감소시키는 함수 호출

newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: -80)
 print(newDate)

3

다음은 지정된 날짜에 모든 유형의 단위 (년 / 월 / 일 / 시간 / 초 등)를 추가 / 빼기 할 수있는 범용 방법입니다.

Swift 2.2 사용

func addUnitToDate(unitType: NSCalendarUnit, number: Int, date:NSDate) -> NSDate {

    return NSCalendar.currentCalendar().dateByAddingUnit(
        unitType,
        value: number,
        toDate: date,
        options: NSCalendarOptions(rawValue: 0))!

}

print( addUnitToDate(.Day, number: 1, date: NSDate()) ) // Adds 1 Day To Current Date
print( addUnitToDate(.Hour, number: 1, date: NSDate()) ) // Adds 1 Hour To Current Date
print( addUnitToDate(.Minute, number: 1, date: NSDate()) ) // Adds 1 Minute To Current Date

// NOTE: You can use negative values to get backward values too

3
NSDateComponents *dayComponent = [[[NSDateComponents alloc] init] autorelease];
dayComponent.day = 1;

NSCalendar *theCalendar = [NSCalendar currentCalendar];
dateToBeIncremented = [theCalendar dateByAddingComponents:dayComponent toDate:dateToBeIncremented options:0];

좋아-나는 이것이 나를 위해 일할 것이라고 생각했다. 그러나 2013 년 3 월 31 일에 하루를 추가하는 데 사용하면 23 시간 만 추가 된 날짜가 반환됩니다. 실제로 24가있을 수 있지만 계산에 사용하면 23:00 시간 만 추가됩니다.

마찬가지로 2013 년 10 월 28 일로 급증하면 코드에 25 시간이 추가되어 날짜 시간이 2013-10-28 01:00:00이됩니다.

하루를 추가하기 위해 상단에있는 일을하고 있었고 다음을 추가했습니다.

NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

주로 일광 절약으로 인해 복잡합니다.


일 년에 한 번 23 시간 밖에 걸리지 않습니다. 한 번 25. 그리고 몇 년마다 그것은 60*60*24 + 1윤초 때문에 길이가 있습니다. 날짜는이 모든 것을 포함해야하므로 코코아의 날짜 처리가 실제로 좋은 이유입니다!
vikingosegundo

2
NSDate *now = [NSDate date];
int daysToAdd = 1;
NSDate *tomorrowDate = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEEE, dd MMM yyyy"];
NSLog(@"%@", [dateFormatter stringFromDate:tomorrowDate]);

2

신속하게 NSDate에서 메소드를 추가하도록 확장 할 수 있습니다

extension NSDate {
    func addNoOfDays(noOfDays:Int) -> NSDate! {
        let cal:NSCalendar = NSCalendar.currentCalendar()
        cal.timeZone = NSTimeZone(abbreviation: "UTC")!
        let comps:NSDateComponents = NSDateComponents()
        comps.day = noOfDays
        return cal.dateByAddingComponents(comps, toDate: self, options: nil)
    }
}

이것을 다음과 같이 사용할 수 있습니다

NSDate().addNoOfDays(3)

2

스위프트 4 업데이트 :

let now = Date() // the current date/time
let oneDayFromNow = Calendar.current.date(byAdding: .day, value: 1, to: now) // Tomorrow with same time of day as now

1

신속한 2.2 :

let today = NSDate()
let tomorrow = NSCalendar.currentCalendar().dateByAddingUnit(
        .Day,
        value: 1,
        toDate: today,
        options: NSCalendarOptions.MatchStrictly)

이것이 누군가를 돕기를 바랍니다!


1

Swift 4, 만약 당신이 정말로 필요한 전부가 "1 달력 일"이 아닌 24 시간 교대 (60 * 60 * 24 초)라면

미래: let dayAhead = Date(timeIntervalSinceNow: TimeInterval(86400.0))

과거: let dayAgo = Date(timeIntervalSinceNow: TimeInterval(-86400.0))


1

신속한 5 업데이트

let nextDate = fromDate.addingTimeInterval(60*60*24)

0
NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
NSDate *startDate = [calendar dateFromComponents:components];
NSLog(@"StartDate = %@", startDate);

components.day += 1;
NSDate *endDate = [calendar dateFromComponents:components];
NSLog(@"EndDate = %@", endDate);

0

나는 같은 문제가 있었다. NSDate에 대한 확장을 사용하십시오.

- (id)dateByAddingYears:(NSUInteger)years
                 months:(NSUInteger)months
                   days:(NSUInteger)days
                  hours:(NSUInteger)hours
                minutes:(NSUInteger)minutes
                seconds:(NSUInteger)seconds
{
    NSDateComponents * delta = [[[NSDateComponents alloc] init] autorelease];
    NSCalendar * gregorian = [[[NSCalendar alloc]
                               initWithCalendarIdentifier:NSCalendarIdentifierGregorian] autorelease];

    [delta setYear:years];
    [delta setMonth:months];
    [delta setDay:days];
    [delta setHour:hours];
    [delta setMinute:minutes];
    [delta setSecond:seconds];

    return [gregorian dateByAddingComponents:delta toDate:self options:0];
}

0

스위프트 2.0

let today = NSDate()    
let calendar = NSCalendar.currentCalendar()
let tomorrow = calendar.dateByAddingUnit(.Day, value: 1, toDate: today, options: NSCalendarOptions.MatchFirst)

0

swift 4 또는 swift 5에서는 다음과 같이 사용할 수 있습니다.

    let date = Date()
    let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: date)
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let yesterday_date = dateFormatter.string(from: yesterday!)
    print("yesterday->",yesterday_date)

산출:

Current date: 2020-03-02
yesterday date: 2020-03-01

0

문자열 확장 : String_Date 변환 > 날짜

extension String{
  func DateConvert(oldFormat:String)->Date{ // format example: yyyy-MM-dd HH:mm:ss 
    let isoDate = self
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
    dateFormatter.dateFormat = oldFormat
    return dateFormatter.date(from:isoDate)!
  }
}

날짜 확장 : 날짜 변환 > 문자열

extension Date{
 func DateConvert(_ newFormat:String)-> String{
    let formatter = DateFormatter()
    formatter.dateFormat = newFormat
    return formatter.string(from: self)
 }
}

날짜 연장 : Get +/- Date

extension String{
  func next(day:Int)->Date{
    var dayComponent    = DateComponents()
    dayComponent.day    = day
    let theCalendar     = Calendar.current
    let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
    return nextDate!
  }

 func past(day:Int)->Date{
    var pastCount = day
    if(pastCount>0){
        pastCount = day * -1
    }
    var dayComponent    = DateComponents()
    dayComponent.day    = pastCount
    let theCalendar     = Calendar.current
    let nextDate        = theCalendar.date(byAdding: dayComponent, to: Date())
    return nextDate!
 }
}

용법:

let today = Date()
let todayString = "2020-02-02 23:00:00"
let newDate = today.DateConvert("yyyy-MM-dd HH:mm:ss") //2020-02-02 23:00:00
let newToday = todayString.DateConvert(oldFormat: "yyyy-MM-dd HH:mm:ss")//2020-02-02
let newDatePlus = today.next(day: 1)//2020-02-03 23:00:00
let newDateMinus = today.past(day: 1)//2020-02-01 23:00:00

참조 : 여러 질문
에서 NSDate에 하루를 어떻게 추가합니까?
양수 int를 음수로 변환하고 음수를 양수로 변환하는 수학 함수?
NSString을 NSDate로 변환 (다시 다시)


-1

다음 코드를 사용하십시오.

NSDate *now = [NSDate date];
int daysToAdd = 1;
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];

같이

addTimeInterval

더 이상 사용되지 않습니다.


3
일 때문에 일광 절약 시간으로, 23, 24 또는 25 시간 수
vikingosegundo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.