2012-06-02 14 views
5

Me gustaría obtener la hora y el minuto actuales como números enteros. Si ahora mismo son las 3:16 am, me gustaría obtener los dos enteros: 3 y 16.En Objective-C, para obtener la hora y los minutos actuales como enteros, ¿necesitamos usar NSDateComponents y NSCalendar?

Pero parece que [NSDate date] dará el número de segundos desde 1970, o puede dar una cadena de corriente representación del tiempo, pero no hay una manera fácil de obtenerlos como enteros?

Veo una publicación en Getting current time, pero se trata de NSDateComponents y NSCalendar? Eso es demasiado complicado ... todo lo que había necesidad hay algo así como

NSDate *date = [NSDate date]; 
int hour = [date getHour];  // which is not possible 

una manera más sencilla de utilizar 3 clases, NSDateNSDateComponents y NSCalendar para obtener la hora actual como un entero, o por lo general, en el Objetivo -C, ¿seguiríamos utilizando el lenguaje C localtime y tm para obtener la hora como un número entero?

+0

Revisé la referencia, y creo que no hay otra forma de evitar esto. NSDate parece ser solo la cantidad de segundos. – nhahtdh

+0

Puede agregar un catálogo en NSDate y extenderlo para calcular el getHour usando algunos cálculos de segundos para fecha, ¿está dispuesto a hacerlo? –

Respuesta

9

NSDate simplemente mantiene el tiempo que ha pasado desde una cierta fecha de referencia, para obtener más significativas números fuera de este (por ejemplo. Después de atender el horario de verano, los años bisiestos y todas las otras cosas de tiempo estúpida), tiene para usar NSDateComponents con el NSCalendar apropiado.

+0

+1 Buena explicación – Adam

+8

Para decirlo de otra manera, un 'NSDate' hace referencia a un momento en el tiempo. Ese momento se puede conocer como las 3:16 a.m. donde se encuentra, pero el mismo momento se puede conocer como las 6:16 p.m. o incluso las 12:46 a.m. en otro lugar. No hay nada sobre el momento * solo * que corresponde a "3:16 am", también debe especificar un huso horario y un calendario. –

+0

@KenThomases mejor! +1 – user523234

17

La forma de interpretar los segundos desde 1970 depende del calendario que esté utilizando. Simplemente no hay otra opción. Afortunadamente, no es tan difícil de configurar. Consulte la "Guía de programación de datos y tiempos" para obtener muchos ejemplos. En su caso:

// Assume you have a 'date' 
NSCalendar *gregorianCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *dateComps = [gregorianCal components: (NSHourCalendarUnit | NSMinuteCalendarUnit) 
               fromDate: date]; 
// Then use it 
[dateComps minute]; 
[dateComps hour]; 

Así que realmente no es tan complicado.

También tenga en cuenta que se podría crear una 'Categoría Clase' para encapsular esto como:

@interface NSDate (MyGregorianDateComponents) 
    - (NSInteger) getGregorianHour; 
    - (NSInteger) getGregorianMinute; 
    @end 
+0

Lee la pregunta nuevamente. Hay un enlace – Adam

1

Mi clase puede ayudar. https://github.com/TjeerdVurig/Vurig-Calendar/blob/master/Vurig%20Calendar/NSDate%2Bconvenience.m

estoy seguro de que pueda averiguar la parte :) minutos

+0

por cierto, más tarde parece que NSDateComponents quería los indicadores de bit para que pueda dar los datos requeridos por un único cálculo, en lugar de calcular todo una vez por hora, y luego calcular todo de nuevo por el minuto –

+0

Sí Estoy de acuerdo que sería mejor para esta situación –

Cuestiones relacionadas