with tutorial para framework espaƱol djangoproject con applications objective-c cocoa nsdate

objective-c - para - tutorial django



Modificar NSDate para representar 1 mes a partir de hoy (5)

Estoy agregando eventos repetitivos a una aplicación Cocoa en la que estoy trabajando. He repetido todos los días y semanas bien porque puedo definirlos matemáticamente (3600 * 24 * 7 = 1 semana). Uso el siguiente código para modificar la fecha:

[NSDate dateWithTimeIntervalSinceNow:(3600*24*7*(weeks))]

Sé cuántos meses han pasado desde que se repitió el evento, pero no sé cómo hacer un objeto NSDate que represente 1 mes / 3 meses / 6 meses / 9 meses en el futuro. Lo ideal es que el usuario diga repetir mensualmente a partir del 14 de octubre y se repetirá el día 14 de cada mes.


Probablemente use NSCalendarDate.

Obtenga el día de la fecha actual de Mes, mes de año y año de ejercicio común, como tres números.

Agregue el número requerido de meses (1/3/6/9), teniendo en cuenta 1) si esa fecha existe (ej. 31 de abril, 29 de febrero en un año no bisiesto), y 2) prórroga del año.

Cree esa nueva fecha con init de NSCalendarDate: mes: día: hora: minuto: segundo: zona horaria:


NSCalendarDate ya no es compatible con el nuevo SDK, tendrá problemas al compilarse para su distribución.


Use NSCalender, NSDateComponents y NSDate:

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; components.month = 1; NSDate *oneMonthFromNow = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:[NSDate date] options:0];

Simplemente configure las diferentes propiedades de los components para obtener diferentes períodos de tiempo (por ejemplo, 3 meses, 6 meses, etc.).

Nota: Según el contexto, puede utilizar [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease] lugar de [NSCalendar currentCalendar] , si por "1 mes" quiere decir "1 mes en el calendario gregoriano".


Puedes hacer lo siguiente:

NSDate *today = [NSDate date]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [[NSDateComponents alloc] init]; components.month = 1; NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0]; [components release]; NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:nextMonth]; NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents]; [gregorian release];


(Casi lo mismo que esta pregunta )

De la documentación :

Se desaconseja el uso de NSCalendarDate. Todavía no está en desuso, sin embargo, puede estar en la próxima versión del sistema operativo después de Mac OS X v10.5. Para los cálculos calendáricos, debe usar las combinaciones adecuadas de NSCalendar, NSDate y NSDateComponents, tal como se describe en Calendarios en los temas de programación de fechas y horas para Cocoa .

Siguiendo ese consejo:

NSDate *today = [NSDate date]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [[NSDateComponents alloc] init]; components.month = 1; NSDate *nextMonth = [gregorian dateByAddingComponents:components toDate:today options:0]; [components release]; NSDateComponents *nextMonthComponents = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit fromDate:nextMonth]; NSDateComponents *todayDayComponents = [gregorian components:NSDayCalendarUnit fromDate:today]; nextMonthComponents.day = todayDayComponents.day; NSDate *nextMonthDay = [gregorian dateFromComponents:nextMonthComponents]; [gregorian release];

Puede haber una implementación más directa o eficiente, pero debe ser precisa y debe apuntar en la dirección correcta.