Cómo Añadir Mes A NSDate Objeto?

NSDate *someDate = [NSDate Date] + 30Days.....;
  • ¿Qué resultado desea usted que si la fecha de inicio es Jan. 31?
InformationsquelleAutor or azran | 2011-11-14

9 Comentarios

  1. 132

    Necesita utilizar NSDateComponents:

    NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
    [dateComponents setMonth:1];
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDate *newDate = [calendar dateByAddingComponents:dateComponents toDate:originalDate options:0];
    [dateComponents release]; //If ARC is not used, release the date components
    • ¿sabes cómo puedo comparar entre ahora para el destino de la fecha? para comprobar si dejo pasar esta fecha?
    • Fecha de las comparaciones se realizan con el NSDate funciones comparar, earlierDate y laterDate – ver el NSDate documentación para que: developer.apple.com/library/mac/#documentation/Cocoa/Reference/…
    • usted puede comparar fechas con: [date timeIntervalSinceDate:otherDate], que devolverá la diferencia entre ellos en cuestión de segundos (menos de 0 para las fechas pasadas, mayor que 0 para fechas futuras).
    • funciona muy bien! tnx
  2. 111

    Con iOS 8 y OS X 10.9 puede agregar NSCalendarUnits utilizando NSCalendar:

    Objective-C

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

    Swift 3

    let date = Calendar.current.date(byAdding: .month, value: 1, to: Date())

    Swift 2

    let cal = NSCalendar.currentCalendar()
    let date = cal.dateByAddingUnit(.Month, value: 1, toDate: NSDate(), options: [])
    • Los ejemplos anteriores son una llamada a un método, no el acceso a una propiedad.
    • Swift 3: vamos a fecha = Calendario.actual.fecha(byAdding: .mes, valor: 1, a: Fecha())
    • Esto debe ser aceptado respuesta. Las actualmente aceptadas respuesta es Objective-C y concisos.
  3. 14

    Para swift 3.0

    extension Date {
        func addMonth(n: Int) -> Date {
            let cal = NSCalendar.current
            return cal.date(byAdding: .month, value: n, to: self)!
        }
        func addDay(n: Int) -> Date {
            let cal = NSCalendar.current
            return cal.date(byAdding: .day, value: n, to: self)!
        }
        func addSec(n: Int) -> Date {
            let cal = NSCalendar.current
            return cal.date(byAdding: .second, value: n, to: self)!
        }
    }
    • ¿Qué sucede si puedo agregar 1 mes, para el 31 de enero que va a terminar en 2 de Marzo de o …?
    • super útil, ahorra tiempo crítico. Gracias !
  4. 12

    Por ejemplo, para agregar 3 meses a la fecha actual en Swift:

    let date = NSCalendar.currentCalendar().dateByAddingUnit(.MonthCalendarUnit, value: 3, toDate: NSDate(), options: nil)!

    En Swift 2.0:

    let date = NSCalendar.currentCalendar().dateByAddingUnit(.Month, value: 3, toDate: NSDate(), options: [])
    • La nueva OptionSetType estructura de NSCalendarUnit permite más que simplemente especifique .Month
    • Parámetros que toman OptionSetType (como el options: parámetro, que tiene NSCalendarOptions) no puede ser nil, por lo tanto, pasar de un conjunto vacío ([]) para representar a «todas las opciones».
    • .MonthCalendarUnit está en desuso, uso .CalendarUnitMonth
  5. 2

    En Swift 2.0

        let startDate = NSDate()
        let dateComponent = NSDateComponents()
        dateComponent.month = 1
        let cal = NSCalendar.currentCalendar()
        let endDate = cal.dateByAddingComponents(dateComponent, toDate: startDate, options: NSCalendarOptions(rawValue: 0))
    • Qué? Usted está agregando un Año y un mes…
  6. 0

    PARA SWIFT 3.0

    aquí es función , usted puede reducir los días , mes ,día por cualquier cuenta
    como por ejemplo aquí , he reducido la fecha actual del sistema del año por año 100 , usted puede hacerlo para el día , el mes, también
    sólo tienes que configurar el contador y, a continuación, almacenar los valores en la matriz , y hacer lo que quieres hacer con esa matriz

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

    Otras respuestas de funcionar bien si su conducta deseada es la adición de un mes y permitiendo el horario de ahorro de luz. Esto produce resultados tales que:

    01/03/2017 00:00 + 1 month -> 31/03/2017 23:00
    01/10/2017 00:00 + 1 month -> 01/11/2017 01:00

    Sin embargo, yo quería ignorar a la hora perdido o ganado por el horario de verano, de tal forma que:

    01/03/2017 00:00 + 1 month -> 01/04/2017 00:00
    01/10/2017 00:00 + 1 month -> 01/11/2017 00:00

    Así que comprobar si el horario de verano límite se pasa, y si por lo que sea sumar o restar una hora en consecuencia:

    func offsetDaylightSavingsTime() -> Date {
            //daylightSavingTimeOffset is either + 1hr or + 0hr. To offset DST for a given date, we need to add an hour or subtract an hour
            //+1hr -> +1hr
            //+0hr -> -1hr
            //offset = (daylightSavingTimeOffset * 2) - 1 hour
    
            let daylightSavingsTimeOffset = TimeZone.current.daylightSavingTimeOffset(for: self)
            let oneHour = TimeInterval(3600)
            let offset = (daylightSavingsTimeOffset * 2) - oneHour
            return self.addingTimeInterval(offset)
        }
    
        func isBetweeen(date date1: Date, andDate date2: Date) -> Bool {
            return date1.compare(self).rawValue * self.compare(date2).rawValue >= 0
        }
    
        func offsetDaylightSavingsTimeIfNecessary(nextDate: Date) -> Date {
            if let nextDST = TimeZone.current.nextDaylightSavingTimeTransition(after: self) {
                if nextDST.isBetweeen(date: self, andDate: nextDate){
                    let offsetDate = nextDate.offsetDaylightSavingsTime()
                    let difference = offsetDate.timeIntervalSince(nextDate)
                    return nextDate.addingTimeInterval(difference)
                }
            }
    
            return nextDate
        }
    
        func dateByAddingMonths(_ months: Int) -> Date? {
            if let dateWithMonthsAdded = Calendar.current.date(byAdding: .month, value: months, to: self) {
                return self.offsetDaylightSavingsTimeIfNecessary(nextDate: dateWithMonthsAdded)
            }
    
            return self
        }

    Prueba:

    func testDateByAddingMonths() {
    let date1 = "2017-01-01T00:00:00Z".asDate()
    let date2 = "2017-02-01T00:00:00Z".asDate()
    let date3 = "2017-03-01T00:00:00Z".asDate()
    let date4 = "2017-04-01T00:00:00Z".asDate()
    let date5 = "2017-05-01T00:00:00Z".asDate()
    let date6 = "2017-06-01T00:00:00Z".asDate()
    let date7 = "2017-07-01T00:00:00Z".asDate()
    let date8 = "2017-08-01T00:00:00Z".asDate()
    let date9 = "2017-09-01T00:00:00Z".asDate()
    let date10 = "2017-10-01T00:00:00Z".asDate()
    let date11 = "2017-11-01T00:00:00Z".asDate()
    let date12 = "2017-12-01T00:00:00Z".asDate()
    let date13 = "2018-01-01T00:00:00Z".asDate()
    let date14 = "2018-02-01T00:00:00Z".asDate()
    var testDate = "2017-01-01T00:00:00Z".asDate()
    XCTAssertEqual(testDate, date1)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date2)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date3)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date4)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date5)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date6)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date7)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date8)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date9)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date10)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date11)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date12)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date13)
    testDate = testDate.dateByAddingMonths(1)!
    XCTAssertEqual(testDate, date14)
    }

    Para la integridad, la .asDate() método que estoy usando

    extension String {
    static let dateFormatter = DateFormatter()
    func checkIsValidDate() -> Bool {
    return self.tryParseToDate() != nil
    }
    func tryParseToDate() -> Date? {
    String.dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
    return String.dateFormatter.date(from: self)
    }
    func asDate() -> Date {
    return tryParseToDate()!
    }
    }
  8. 0

    ¿Desea agregar un «mes» o exactamente 30 días o un día o un año en el usuario selecciona de forma automática el cálculo hasta la fecha.

      NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] 
    init];
    [dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
    NSDateComponents *components = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:[NSDate date]];
    NSDateComponents *dayComponent = [[NSDateComponents alloc] 
    init];
    int changeid = [here number of days intValue];
    dayComponent.hour = changeid;
    NSCalendar *theCalendar = [NSCalendar currentCalendar];
    NSDate *nextDate = [theCalendar 
    dateByAddingComponents:dayComponent toDate:[dateFormatter 
    dateFromString:self.fromDateTF.text] options:0];
    NSLog(@"nextDate: %@ ...", nextDate);
    [self.toDateTF setText:[dateFormatter 
    stringFromDate:nextDate]];

    ////mes

  9. -2

    ¿Desea agregar un «mes» o exactamente 30 días? Si es de 30 días, se hace así:

    //get a date
    NSDate *date = [NSDate dateWithNaturalLanguageString:@"2011-01-02"];
    //add 30 days to it (in seconds)
    date = [date dateByAddingTimeInterval:(30 * 24 * 60 * 60)];
    NSLog(@"%@", date); //2011-02-01

    Nota: esto no tendrá horario de ahorro de luz transiciones o segundos intercalares en cuenta. El uso de @TheEye la respuesta si usted necesita que

    • Esto produciría un error si se utiliza a través de un cambio de horario de verano o de segundos intercalares etc.
    • eso es un punto muy bueno, he añadido una nota incluyendo a mi respuesta. El bajo nivel de sumar/restar segundos todavía pertenece como una de las respuestas. No siempre quieres seguir las cosas como horario de verano, depende de lo que a la fecha está siendo utilizado para.
    • No cada mes tiene 30 días
    • Esto no añadir más de 30 días. Añade 30 veces 86.400 segundos, que es algo totalmente diferente. Que tipo de código es increíblemente malos consejos.
    • Es cierto que esto da un resultado erróneo en el caso de las transiciones de DST. Salto segundos sin embargo, son no un problema, porque el tiempo de Unix no contar con ellas.
    • No hacerlo de esta manera hoy en día, el uso de dateComponent.
    • a pesar del título, el pseudo-código en la pregunta claramente se pregunta cómo agregar 30 días a una fecha. Básicamente lo que hace es que me pide que vuelva a escribir mi respuesta para que coincida con el cuatro otras respuestas – no hay necesidad de un quinto.
    • Mi comentario era para los demás que siguen. Usted debe ser la adición de 30 días, utilizando datecomponent, no por el cálculo de cuántos minutos y segundos suelen ser (que a veces puede ser incorrecta).
    • lo que si es necesario agregar un año en el que usted va a perder un montón de días

Dejar respuesta

Please enter your comment!
Please enter your name here