Bir NSDate'e nasıl 1 gün ekleyebilirim?


320

Temel olarak, başlığın dediği gibi. Bir güne nasıl 1 gün ekleyebileceğimi merak ediyorumNSDate .

Öyleyse:

21st February 2011

Şöyle olur:

22nd February 2011

Veya öyleyse:

31st December 2011

Şöyle olur:

1st January 2012.

4
Bir NSDate'in bir tarihi, zamandaki bir noktayı temsil ettiğini unutmayın. Yani bir tarihin yanı sıra bir zaman da içerir.
Rog

4
Kabul etti - aşağıda Zack German'ın cevabını kullanmalısın. Apple'ın Tarih ve Saat Programlama Kılavuzu'na bakın .
Ash Furrow

Daha yeni (ve daha kısa) çözümler için aşağı kaydırın!
catanore

Yanıtlar:


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

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

Bu kendi kendini açıklayıcı olmalıdır.


19
Bir tarihten çıkarmak için negatif bileşenler de kullanabilirsiniz.
DataGraham

58
Seçilen cevaptan çok daha iyi bir çözüm
Justin Meiners

19
Bir günün değerini eklemek yerine Date bileşenlerini kullanmak için +1.
Abizern

Evet, gün ışığından yararlanma için iyi çalışır. DST kontrolü için ipucu: Mac'inizdeki tarihi ve saati sıfırlayın ve ardından simülatörünüzü yeniden başlatın, daha sonra sistem saatinizi takip edecektir.
Rob van den Berg

2
dateByAddingComponents NSCalendarOptions(rawValue: 0)
Swift'de

270

İOS 8'den beri kullanabilirsiniz NSCalendar.dateByAddingUnit

Swift 1.x'te örnek:

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)

5
Sadece ben miyim yoksa Swift'in böyle bir şeyi inşa etmesi çok daha kolay olmaz mıydı date.add(.days, 1)? * gider ve bir uzantı oluşturur
quemeful

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

82

Swift 5 için güncellendi

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

Hedef 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];

Üniteyi burada maskeleyemeyeceğinizi unutmayın (sadece bir tane kullanın).
catanore

31

Yüksek bakımın cevabı ve vikingosegundo'nun yorumuna dayanan çalışan bir Swift 3+ uygulaması . Bu Tarih uzantısının ayrıca yılı, ayı ve saati değiştirmek için ek seçenekleri vardır:

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 tarafından sorulduğu gibi yalnızca bir gün eklemek için kullanım şu şekilde olur:

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

2
Tarih bileşenlerini kullanarak kodu büyük ölçüde kısaltabilirsiniz.
vikingosegundo

Benim düşünceme göre dezavantajları olmasına rağmen haklısınız: - uzantıyı kullanan kod temiz görünmüyor - cevabıma let foo = Date().add([.calendar: 1, .yearForWeekOfYear: 3] alternatif çözümü ekliyorum gibi biraz mantıklı olan bileşenlerle bazı gereksiz seçenekler açılıyor . Öneriniz için teşekkürler, @vikingosegundo!
Benno Kress


22

Swift 4.0 ( bu harika cevapta Swift 3.0 ile aynı, benim gibi çaylaklar için açıkça anlaşılıyor)

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

3
Değişken adınızı değiştirmeyi unuttunuz mu?
Rakesha Shastri

13

Aşağıdaki işlevi kullanın ve tarih günlerini almak için gün parametresini kullanın.

+ (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

Hızlı

var dayComponenet = NSDateComponents()
dayComponenet.day = 1

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

8

Çalışıyor!

    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];

Görünüşe göre bu soru kod dökümü cenneti. Yani seni ayırmak için bir sebep yok.
Drew

2
cevabım daha doğrudur çünkü NSCalendarWrapComponents (0) seçeneğini kullanırsanız, yalnızca geçerli ay aralığında tarih oluşturabilirsiniz. 31 Ocak 2016'ya NSCalendarWrapComponents ile 1 gün eklerseniz 1 Ocak 2016 alacaksınız demektir. NSCalendarMatchStrictly seçeneği ile bir sonraki takvim tarihini alırsınız.
DenZhukov

8

Swift 3.0 çok basit bir uygulama olurdu:

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

kullanım

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

Not: Kod satırlarının neden bir ünlem işaretiyle sona erdiğini bilmiyorsanız, Google'da "Hızlı Seçenek" konusuna bakın.


3

Sen NSDate en yöntemi kullanabilirsiniz - (id)dateByAddingTimeInterval:(NSTimeInterval)secondsnerede secondsolurdu60 * 60 * 24 = 86400


3
NSDate'in addByTimeInterval'ı iOS 4'te ( bit.ly/vtOzvU ) kullanımdan kaldırıldı . Bunun yerine dateByAddingTimeInterval ( bit.ly/vRkFrN ) kullanın.
billmaya

4
gün, yaz saati nedeniyle 23, 24 veya 25 saat olabilir.
vikingosegundo

3

Swift 2.1.1 ve xcode 7.1 OSX 10.10.5'te, işlevini kullanarak istediğiniz sayıda gün ileri ve geri ekleyebilirsiniz.

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

geçerli tarihi 9 güne kadar artırmak için işlev çağrısı

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

geçerli tarihi 80 gün azaltmak için işlev çağrısı

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

3

Aşağıda, belirtilen tarihte herhangi bir tür birimi (Yıl / Ay / Gün / Saat / Saniye vb.) Eklemenizi / çıkarmanızı sağlayan genel amaçlı bir yöntem bulunmaktadır.

Swift 2.2'yi kullanma

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];

Tamam - bunun benim için işe yarayacağını düşündüm. Ancak, 31 Mart 2013'e bir gün eklemek için kullanırsanız, yalnızca 23 saati eklenmiş bir tarih döndürür. Aslında 24 olabilir, ancak hesaplamalarda kullanmak sadece 23:00 saat ekledi.

Benzer şekilde, 28 Ekim 2013 tarihine kadar ilerlerseniz, kod 25 saat ekleyerek 2013-10-28 01:00:00 tarih saatini oluşturur.

Bir gün eklemek için üstte bir şey yapıyordum, ekleyerek:

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

Temelde gün ışığından yararlanma nedeniyle karmaşıktır.


yılda bir kez sadece 23 saat var. bir kez 25. ve birkaç yılda bir 60*60*24 + 1artık saniye nedeniyle uzunluğu vardır . tarihler tüm bunları kapsamalıdır ve bu nedenle kakaonun tarih kullanımı gerçekten harika!
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

Hızlı bir şekilde NSDate'de yöntem eklemek için uzantı yapabilirsiniz

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

bunu şu şekilde kullanabilirsiniz

NSDate().addNoOfDays(3)

2

Swift 4 için güncelleme:

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

hızlı 2.2 için:

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

Umarım bu birine yardımcı olur!


1

Swift 4, gerçekten ihtiyacınız olan şey "1 takvim günü" değil, 24 saatlik bir vardiya (60 * 60 * 24 saniye)

Gelecek: let dayAhead = Date(timeIntervalSinceNow: TimeInterval(86400.0))

Geçmiş: let dayAgo = Date(timeIntervalSinceNow: TimeInterval(-86400.0))


1

swift 5 için güncelleme

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

Aynı sorunu yaşadım; NSDate için bir uzantı kullanın:

- (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 2.0

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

0

Hızlı 4 veya hızlı 5'te, aşağıdaki gibi kullanabilirsiniz:

    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)

çıktı:

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

0

Dize uzantısı: Convert String_Date> Tarih

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

Tarih uzantısı: Tarihi Dönüştür > Dize

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

Tarih uzantısı: +/- Tarih Alın

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

Kullanımı:

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

reference: birden fazla soru
NSDate'e nasıl 1 gün ekleyebilirim?
matematik işlevi pozitif int negatif ve negatif pozitif dönüştürmek için?
NSString'i NSDate'e dönüştürme (ve tekrar geri)


-1

Aşağıdaki kodu kullanın:

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

Gibi

addTimeInterval

artık kullanımdan kaldırıldı.


3
gün ışığından yararlanma saatleri nedeniyle 23, 24 veya 25 saat sürebilir
vikingosegundo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.