ฉันจะเพิ่ม 1 วันใน NSDate ได้อย่างไร


320

โดยทั่วไปตามที่ชื่อกล่าว ฉันสงสัยว่าฉันจะเพิ่ม 1 วันได้NSDateอย่างไร

ดังนั้นถ้าเป็น:

21st February 2011

มันจะกลายเป็น:

22nd February 2011

หรือถ้าเป็น:

31st December 2011

มันจะกลายเป็น:

1st January 2012.

4
โปรดทราบว่า NSDate ไม่ได้เป็นตัวแทนของวันที่ แต่จะแสดงถึงจุดในเวลา ดังนั้นจึงรวมถึงเวลาเช่นเดียวกับวันที่
Rog

4
ตกลง - คุณควรใช้คำตอบของ Zack German ด้านล่าง ดูแอปเปิ้ลวันที่และเวลา Programming คู่มือ
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
+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)
    )

Swift 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
มันเป็นเพียงฉันหรือมันจะไม่ง่ายมากสำหรับสวิฟท์ที่จะมีบางสิ่งบางอย่างในตัวเช่นdate.add(.days, 1)? * ไปและสร้างส่วนขยาย
quemeful

2
extension Date { func adding(_ component: Calendar.Component, _ value: Int) -> Date? { return Calendar.current.date(byAdding: component, value: value, to: self) } }การใช้งาน@quemefulDate().adding(.day, 1) // "Jun 6, 2019 at 5:35 PM"
Leo Dabus

82

อัปเดตสำหรับ Swift 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

ทำงานการดำเนินงานสวิฟท์ 3 +ขึ้นอยู่กับhighmaintenance ของคำตอบและvikingosegundo ของความคิดเห็น ส่วนขยายวันที่นี้ยังมีตัวเลือกเพิ่มเติมในการเปลี่ยนปีเดือนและเวลา:

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

ใช้ฟังก์ชั่นด้านล่างและใช้พารามิเตอร์วันเพื่อรับวันที่ 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) คุณสามารถสร้างวันที่ในช่วงเดือนปัจจุบันเท่านั้น หมายความว่าหากคุณเพิ่ม 1 วันด้วย NSCalendarWrapComponents ถึง Jan, 31 2016 คุณจะได้รับ Jan, 1 2016 ด้วยตัวเลือก 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

Swift 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

หมายเหตุ: หากคุณไม่ทราบสาเหตุที่บรรทัดของรหัสลงท้ายด้วยเครื่องหมายอัศเจรีย์ค้นหา "Swift Optionals" บน Google


3

คุณสามารถใช้วิธีการของ NSDate - (id)dateByAddingTimeInterval:(NSTimeInterval)secondsที่secondsจะเป็น60 * 60 * 24 = 86400


3
addByTimeInterval ของ NSDate เลิกใช้แล้วใน 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];

ตกลง - ฉันคิดว่าสิ่งนี้จะได้ผลสำหรับฉัน อย่างไรก็ตามหากคุณใช้เพื่อเพิ่มวันในวันที่ 31 มีนาคม 2013 วันนั้นจะส่งคืนวันที่ซึ่งเพิ่มไว้เพียง 23 ชั่วโมง มันอาจมี 24 จริง ๆ แต่การใช้ในการคำนวณได้เพิ่มเวลา 23:00 น

ในทำนองเดียวกันหากคุณส่งต่อไปยังวันที่ 28 ตุลาคม 2013 รหัสจะเพิ่ม 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

ใน swift คุณสามารถต่อเติมเพื่อเพิ่มเมธอดใน 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

อัปเดตสำหรับ Swift 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 หากสิ่งที่คุณต้องการจริงๆคือการเปลี่ยน 24 ชั่วโมง (60 * 60 * 24 วินาที) และไม่ใช่ "1 วันปฏิทิน"

อนาคต: let dayAhead = Date(timeIntervalSinceNow: TimeInterval(86400.0))

ที่ผ่านมา: let dayAgo = Date(timeIntervalSinceNow: TimeInterval(-86400.0))



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

ใน swift 4 หรือ swift 5 คุณสามารถใช้เช่น bellow:

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

ส่วนขยายวันที่: รับ +/- วันที่

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

การอ้างอิง: จากหลายคำถาม
ฉันจะเพิ่ม 1 วันใน NSDate ได้อย่างไร
ฟังก์ชันทางคณิตศาสตร์ในการแปลงค่าบวกเป็นลบและลบเป็นบวก
การแปลง 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.