¿Cómo puedo obtener el año / mes / día de un NSDate
objeto, sin 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 molestia para algo tan simple como obtener un NSDate
año / mes / día. hay alguna otra solucion?
objective-c
nsdate
nsdatecomponents
nscalendar
Richard J. Ross III
fuente
fuente
Respuestas:
Como 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,
NSDate
en sí mismo simplemente marca un punto en el tiempo de la máquina, no una fecha. No existe una correlación entre el punto en el tiempo especificado por unNSDate
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 los calendarios gregoriano y judío, por ejemplo), y aunque el calendario gregoriano es el calendario más utilizado en el mundo, supongo, estamos un poco sesgados queNSDate
siempre deberían usarlo.NSDate
Afortunadamente, es mucho más bipartidista.Obtendrá la fecha y la hora
NSCalendar
, como mencionó, pero hay una manera más simple de hacerlo:Eso genera un
NSDateComponents
objeto 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 sistema predeterminado).Por supuesto, si está usando un calendario o fecha diferente, puede cambiarlo fácilmente. Se puede encontrar una lista de calendarios y unidades de calendario disponibles en la
NSCalendar
Referencia de clase . SeNSDateComponents
puede encontrar más información sobre laNSDateComponents
Referencia de clase .Como referencia, acceder a componentes individuales desde
NSDateComponents
es bastante fácil:Solo debe tener en cuenta:
NSDateComponents
no contendrá información válida para los campos que solicite a menos que los haya generado con esa información válida (es decir, soliciteNSCalendar
proporcionar esa información conNSCalendarUnit
s).NSDateComponents
no contienen información de referencia en sí mismas: son solo estructuras simples que contienen números para que usted acceda. Si desea obtener una era, por ejemplo, fuera deNSDateComponents
, tendrá que alimentar el método generadorNSCalendar
con laNSCalendarUnitEra
bandera.fuente
NSCalendar
El+currentCalendar
método devolverá el calendario del sistema, por lo que si el teléfono del usuario está configurado en el modo de hora japonés o tailandés, obtendrá un año diferente. Si desea forzar un sistema de calendario específico, cree un calendario e inicialícelo con la configuración regional adecuada. Por ejemplo, para forzar un calendario gregoriano, querrás usar lo siguiente:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
Puede obtener un componente separado de un NSDate usando NSDateFormatter:
Si desea obtener el número del mes en lugar de la abreviatura, use "MM". Si desea obtener enteros, use
[myDayString intValue];
fuente
Solo para reformular el excelente código de Itai (¡y funciona!), Así es como se vería una clase auxiliar de muestra, para devolver el valor del año de una variable NSDate dada.
Como puede ver, es bastante fácil modificar este código para obtener el mes o el día.
(No puedo creer que tengamos que escribir nuestras propias funciones básicas de fecha de iOS como esta, en 2013 ...)
Otra cosa: nunca use <y> para comparar dos valores NSDate.
XCode aceptará felizmente dicho código (sin errores ni advertencias), pero sus resultados son una lotería. Usted debe utilizar la función "Comparar" compara NSDates:
fuente
En Swift 2.0:
fuente
Estoy escribiendo esta respuesta porque es el único enfoque que no te devuelve opciones de las
NSDateComponent
variables y / o fuerza el desenvolvimiento de esas variables (también para Swift 3).Swift 3
Swift 2
Bonus Swift 3 versión divertida
fuente
Nuevo en iOS 8
ObjC
Rápido
fuente
Si está apuntando a iOS 8+, puede usar los nuevos
NSCalendar
métodos de conveniencia para lograr esto en un formato más conciso.Primero cree un
NSCalendar
y use lo queNSDate
sea necesario.Puede extraer componentes individualmente a través de
component:fromDate:
O, aún más sucintamente, use
NSInteger
punteros a través degetEra:year:month:day:fromDate:
Para obtener más información y ejemplos, consulte NSDate Manipulation Made Easy en iOS 8 . Descargo de responsabilidad, escribí la publicación.
fuente
A partir de iOS 8.0 (y OS X 10), puede usar el método del componente para simplificar la obtención de un único componente de fecha de la siguiente manera:
Debería simplificar las cosas y, con suerte, esto se implementa de manera eficiente.
fuente
Si desea obtener los NSDateComponents individuales de NSDate, definitivamente necesitará la solución sugerida por Itai Ferber. Pero si desea pasar de NSDate directamente a un NSString, puede usar NSDateFormatter .
fuente
fuente
Aquí está la solución en Swift:
fuente
Prueba esto . . .
Fragmento de código:
Da año actual, mes, fecha
fuente
Intenta lo siguiente:
fuente
Swift 2.x
Puedes usarlo como
Salida
fuente
Rápido
La forma más fácil de obtener cualquier elemento de fecha como una cadena opcional.
fuente
lo hago de esta manera ...
fuente
Para obtener una cadena legible por humanos (día, mes, año), puede hacer lo siguiente:
fuente