NSDate obtener año/mes/día

Resuelto Richard J. Ross III asked hace 14 años • 17 respuestas

¿Cómo puedo obtener el año/mes/día de un NSDateobjeto sin tener otra información? Me doy cuenta de que probablemente podría hacer esto con algo similar a esto:

NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];

Pero eso parece ser una gran molestia para algo tan simple como obtener un NSDateaño/mes/día. hay alguna otra solucion?

Richard J. Ross III avatar Sep 12 '10 19:09 Richard J. Ross III
Aceptado

Debido a que aparentemente esta es mi respuesta más popular, intentaré editarla para que contenga un poco más de información.

A pesar de su nombre, NSDateen sí mismo simplemente marca un punto en el tiempo de la máquina, no una fecha. No existe correlación entre el momento especificado por an NSDatey un año, mes o día. Para eso, debes consultar un calendario. Cualquier momento dado devolverá información de fecha diferente según el calendario que esté mirando (las fechas no son las mismas en el calendario gregoriano y judío, por ejemplo), y aunque el calendario gregoriano es el calendario más utilizado en el mundo - supongo - somos un poco parciales y NSDatedeberíamos usarlo siempre. NSDate, afortunadamente, es mucho más bipartidista.


Obtener la fecha y la hora tendrá que pasar por NSCalendar, como mencionaste, pero hay una manera más sencilla de hacerlo:

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];

Eso genera un NSDateComponentsobjeto que contiene el día, mes y año del calendario actual del sistema para el día actual. ( Nota: este no es necesariamente el calendario actual especificado por el usuario , solo el calendario predeterminado del sistema).

Por supuesto, si estás usando un calendario o fecha diferente, puedes cambiarlo fácilmente. Puede encontrar una lista de calendarios y unidades de calendario disponibles en la NSCalendarReferencia de clase . NSDateComponentsPuede encontrar más información al respecto en la NSDateComponentsReferencia de clase .


Como referencia, acceder a componentes individuales desde NSDateComponentses bastante fácil:

NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];

Solo debe tener en cuenta: NSDateComponentsno contendrá información válida para ningún campo que solicite a menos que los haya generado con esa información válida (es decir, solicite NSCalendarproporcionar esa información con NSCalendarUnitcorreos electrónicos). NSDateComponentsNo contienen información de referencia en sí mismos: son simplemente estructuras simples que contienen números a los que usted puede acceder. Si también desea obtener una era, por ejemplo, de NSDateComponents, tendrá que alimentar el método generador NSCalendarcon la NSCalendarUnitErabandera.

Itai Ferber avatar Sep 12 '2010 15:09 Itai Ferber

Puede obtener un componente separado de NSDate usando NSDateFormatter:

NSDateFormatter *df = [[NSDateFormatter alloc] init];

[df setDateFormat:@"dd"];
myDayString = [df stringFromDate:[NSDate date]];

[df setDateFormat:@"MMM"];
myMonthString = [df stringFromDate:[NSDate date]];

[df setDateFormat:@"yy"];
myYearString = [df stringFromDate:[NSDate date]];

Si desea obtener el número del mes en lugar de la abreviatura, utilice "MM". Si desea obtener números enteros, utilice[myDayString intValue];

skocko76 avatar Dec 15 '2011 16:12 skocko76