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.