Bagaimana cara menambahkan 1 hari ke NSDate?

320

Pada dasarnya, seperti judulnya. Saya ingin tahu bagaimana saya bisa menambahkan 1 hari ke NSDate.

Jadi jika itu:

21st February 2011

Itu akan menjadi:

22nd February 2011

Atau jika itu:

31st December 2011

Itu akan menjadi:

1st January 2012.
Andrew
sumber
4
Perhatikan bahwa NSDate tidak mewakili tanggal, itu mewakili titik waktu. Jadi itu termasuk waktu serta tanggal.
Rog
4
Setuju - Anda harus menggunakan jawaban Zack German di bawah ini. Lihat Panduan Pemrograman Tanggal dan Waktu Apple .
Ash Furrow
Gulir ke bawah untuk solusi yang lebih baru (dan lebih pendek)!
catanore

Jawaban:

711

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

Sasaran 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);

Ini harus jelas.

Bahasa Jerman Zaky
sumber
19
Anda juga dapat menggunakan komponen negatif untuk mengurangi tanggal.
DataGraham
58
Solusi yang jauh lebih baik daripada jawaban yang dipilih
Justin Meiners
19
+1 untuk menggunakan komponen Tanggal daripada menambahkan nilai satu detik dalam sehari.
Abizern
Ya berfungsi dengan baik untuk penghematan siang hari. Kiat untuk pemeriksaan DST: Setel ulang tanggal dan waktu pada mac Anda dan kemudian restart simulator Anda, kemudian akan mengikuti waktu sistem Anda.
Rob van den Berg
2
Di Swift Anda perlu mengubah parameter dateByAddingComponents panggilan terakhir keNSCalendarOptions(rawValue: 0)
gfpacheco
270

Karena iOS 8 dapat Anda gunakan NSCalendar.dateByAddingUnit

Contoh dalam 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: []
    )

Swift 3.0:

let today = Date()
let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: today)
Ben Sinclair
sumber
5
Apakah hanya saya, atau bukankah akan lebih mudah bagi Swift untuk memiliki sesuatu yang seperti itu date.add(.days, 1)? * pergi dan membangun ekstensi
quemeful
2
@quemeful extension Date { func adding(_ component: Calendar.Component, _ value: Int) -> Date? { return Calendar.current.date(byAdding: component, value: value, to: self) } }penggunaanDate().adding(.day, 1) // "Jun 6, 2019 at 5:35 PM"
Leo Dabus
82

Diperbarui untuk Swift 5

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

Tujuan 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];
iHS
sumber
34

iOS 8+, OSX 10.9+, Objective-C

NSCalendar *cal = [NSCalendar currentCalendar];    
NSDate *tomorrow = [cal dateByAddingUnit:NSCalendarUnitDay 
                                   value:1 
                                  toDate:[NSDate date] 
                                 options:0];
vikingosegundo
sumber
Perhatikan bahwa Anda tidak dapat menutupi unit di sini (hanya menggunakan satu).
catanore
31

Sebuah bekerja pelaksanaan Swift 3 + berdasarkan highmaintenance ini jawaban dan vikingosegundo ini komentar. Ekstensi Tanggal ini juga memiliki opsi tambahan untuk mengubah tahun, bulan, dan waktu:

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

}

Penggunaan untuk hanya menambah satu hari seperti yang diminta OP akan menjadi:

let today = Date() // date is then today for this example
let tomorrow = today.add(days: 1)
Benno Kress
sumber
2
Anda dapat mempersingkat kode secara masif dengan menggunakan komponen tanggal.
vikingosegundo
Anda benar, meskipun ada kerugiannya menurut saya: - kode yang menggunakan ekstensi tidak terlihat bersih - ini membuka beberapa opsi yang tidak perlu dengan komponen yang tidak masuk akal seperti let foo = Date().add([.calendar: 1, .yearForWeekOfYear: 3] saya menambahkan solusi alternatif untuk jawaban saya. . Terima kasih atas saran Anda, @vikingosegundo!
Benno Kress
3
baik, saya sebenarnya berarti sesuatu yang berbeda: gist.github.com/vikingosegundo/31ddb14920415ef444a9ab550411d4ff
vikingosegundo
22

Swift 4.0 (sama seperti Swift 3.0 dalam jawaban yang luar biasa ini hanya menjelaskan untuk pemula seperti saya)

let today = Date()
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: today)
Joshua Dance
sumber
3
Apakah Anda lupa mengubah nama variabel Anda?
Rakesha Shastri
13

Gunakan fungsi di bawah ini dan gunakan parameter hari untuk mendapatkan tanggal hari. Kepala / hari

+ (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;
}
Bhupendra
sumber
10

Dengan cepat

var dayComponenet = NSDateComponents()
dayComponenet.day = 1

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

Ini berhasil!

    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];
DenZhukov
sumber
Yah rupanya pertanyaan ini adalah kode tempat pembuangan surga. Jadi tidak ada alasan untuk memilih Anda.
Drew
2
jawaban saya lebih tepat karena jika Anda menggunakan opsi NSCalendarWrapComponents (0) Anda dapat membuat tanggal hanya dalam kisaran bulan berjalan. Ini berarti bahwa jika Anda menambahkan 1 hari dengan NSCalendarWrapComponents ke Jan, 31 2016 Anda akan mendapatkan Jan, 1 2016. Dengan opsi NSCalendarMatchStrictly Anda akan mendapatkan tanggal kalender berikutnya.
DenZhukov
8

Implementasi Swift 3.0 yang sangat sederhana adalah:

func dateByAddingDays(inDays: Int) -> Date {
    let today = Date()
    return Calendar.current.date(byAdding: .day, value: inDays, to: today)!
}
AmJa
sumber
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];
Rahul Gupta
sumber
5

Cepat 4.0

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

Pemakaian

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

Catatan: Jika Anda tidak tahu mengapa baris kode diakhiri dengan tanda seru, cari "Swift Optionals" di Google.

unik
sumber
3

Anda dapat menggunakan metode NSDate di - (id)dateByAddingTimeInterval:(NSTimeInterval)secondsmana secondsakan berada60 * 60 * 24 = 86400

Tiago
sumber
3
AddByTimeInterval NSDate sudah tidak digunakan lagi di iOS 4 ( bit.ly/vtOzvU ). Gunakan dateByAddingTimeInterval ( bit.ly/vRkFrN ) sebagai gantinya.
billmaya
4
hari dapat memiliki 23, 24 atau 25 jam, karena waktu musim panas.
vikingosegundo
3

Di Swift 2.1.1 dan xcode 7.1 OSX 10.10.5, Anda dapat menambahkan beberapa hari ke depan dan ke belakang menggunakan fungsi

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

panggilan fungsi untuk menambah tanggal saat ini sebanyak 9 hari

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

panggilan fungsi untuk tanggal saat ini pengurangan sebesar 80 hari

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

Berikut adalah metode tujuan umum yang memungkinkan Anda menambah / mengurangi segala jenis unit (Tahun / Bulan / Hari / Jam / Detik, dll.) Pada tanggal yang ditentukan.

Menggunakan 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
n.by.n
sumber
3
NSDateComponents *dayComponent = [[[NSDateComponents alloc] init] autorelease];
dayComponent.day = 1;

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

Ok - saya pikir ini akan bekerja untuk saya. Namun, jika Anda menggunakannya untuk menambah hari ke 31 Maret 2013, itu akan mengembalikan tanggal yang hanya 23 jam ditambahkan ke dalamnya. Mungkin sebenarnya memiliki 24, tetapi menggunakan dalam perhitungan hanya 23:00 jam ditambahkan.

Demikian pula, jika Anda maju ke 28 Oktober 2013, kode menambahkan 25 jam sehingga menghasilkan waktu tanggal 2013-10-28 01:00:00.

Untuk menambah satu hari saya melakukan hal di atas, menambahkan:

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

Rumit, terutama karena penghematan siang hari.

Carl Hine
sumber
setahun sekali sehari hanya memiliki 23 jam. sekali 25. dan setiap beberapa tahun ia memiliki panjang 60*60*24 + 1karena detik kabisat. kurma harus mencakup semua ini, dan itulah sebabnya penanganan kurma sebenarnya hebat!
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]);
Shrikant Tanwade
sumber
2

Dengan cepat Anda dapat membuat ekstensi untuk menambahkan metode di 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)
    }
}

Anda dapat menggunakan ini sebagai

NSDate().addNoOfDays(3)
Muhammad Aamir Ali
sumber
2

Pembaruan untuk 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
Ryan
sumber
1

untuk swift 2.2:

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

Semoga ini bisa membantu seseorang!

Paul Lehn
sumber
1

Swift 4, jika yang Anda butuhkan adalah shift 24 jam (60 * 60 * 24 detik) dan bukan "1 hari kalender"

Masa depan: let dayAhead = Date(timeIntervalSinceNow: TimeInterval(86400.0))

Lalu: let dayAgo = Date(timeIntervalSinceNow: TimeInterval(-86400.0))

John Robi
sumber
1

pembaruan untuk swift 5

let nextDate = fromDate.addingTimeInterval(60*60*24)
Manish
sumber
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);
Vũ Ngọc Giang
sumber
0

Saya memiliki masalah yang sama; gunakan ekstensi untuk 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];
}
slashlos
sumber
0

Swift 2.0

let today = NSDate()    
let calendar = NSCalendar.currentCalendar()
let tomorrow = calendar.dateByAddingUnit(.Day, value: 1, toDate: today, options: NSCalendarOptions.MatchFirst)
Sébastien REMY
sumber
0

Di swift 4 atau swift 5, Anda bisa menggunakan seperti di bawah ini:

    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)

keluaran:

Current date: 2020-03-02
yesterday date: 2020-03-01
Enamul Haque
sumber
0

Ekstensi string: Konversi String_Date> Tanggal

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

Ekstensi tanggal: Konversi Tanggal> String

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

Ekstensi tanggal: Dapatkan +/- Tanggal

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

Pemakaian:

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

referensi: dari banyak pertanyaan
Bagaimana cara menambahkan 1 hari ke NSDate?
fungsi matematika untuk mengubah int positif ke negatif dan negatif ke positif?
Konversi NSString ke NSDate (dan kembali lagi)

Muhammad Asyraf
sumber
-1

Gunakan kode berikut:

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

Sebagai

addTimeInterval

sekarang sudah ditinggalkan.

Hemang
sumber
3
hari dapat memiliki 23, 24 atau 25 jam, karena waktu musim
panas