2010-05-28 11 views
102

En mi aplicación tengo que conseguir la hora y los minutos por separado:¿Cómo obtengo una hora y minutos de NSDate?

NSString *currentHour=[string1 substringWithRange: NSMakeRange(0,2)]; 
     int currentHourInNumber=[currentHour intValue]; 

Considere string1 contiene 11:59:13 AM que viene de selector de fechas.

Aquí si uso por encima de código, que está bien para obtener horas si es superior a 9. más que tenga que cambiar NSMakeRange(0,1) para obtener hora entre 1 a 9.

¿Existen métodos para conseguir la hora, minutos , etc.?

Gracias de antemano, por favor proporcione el código de muestra.

+0

Posible duplicado de [¿Cómo obtener la hora del día con Swift?] (Https://stackoverflow.com/questions/24137692/how-to-get-the-hour-of-the-day-with-swift) –

Respuesta

238

Utilice un NSDateFormatter para convertir string1 en un NSDate, a continuación, obtener la necesaria NSDateComponents:

Obj-C:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"<your date format goes here"]; 
NSDate *date = [dateFormatter dateFromString:string1]; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *components = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:date]; 
NSInteger hour = [components hour]; 
NSInteger minute = [components minute]; 

Swift 1 y 2:

let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "Your date Format" 
let date = dateFormatter.dateFromString(string1) 
let calendar = NSCalendar.currentCalendar() 
let comp = calendar.components([.Hour, .Minute], fromDate: date) 
let hour = comp.hour 
let minute = comp.minute 

Swift 3:

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "Your date Format" 
let date = dateFormatter.date(from: string1) 
let calendar = Calendar.current 
let comp = calendar.dateComponents([.hour, .minute], from: date) 
let hour = comp.hour 
let minute = comp.minute 

Más acerca del dateformat está en el sitio Unicode oficial

+0

gracias Thomas esto es exactamente lo que estoy buscando – mac

+0

Hola Una más duda, ¿es posible cambiar la hora, minuto en NSDate – mac

+0

Para cambiar la hora y el minuto, tal vez mirar en NSDate's + dateWithTimeIntervalSinceReferenceDate :. Ese método le permite agregar una cantidad específica de segundos hasta la fecha (y devolver una nueva fecha). –

45

Si sólo lo necesita para presentando como una cadena el siguiente código es mucho más fácil

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"HH:mm"]; 

NSString *startTimeString = [formatter stringFromDate:startTimePicker.date]; 
+0

Perfecto y corto! –

42

Esto me parece ser lo que la pregunta es después, no hay necesidad de formateadores:

NSDate *date = [NSDate date]; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *components = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:date]; 
NSInteger hour = [components hour]; 
NSInteger minute = [components minute]; 
+2

¿Hay alguna razón por la que está utilizando punteros NSInteger para almacenar los valores de componentes específicos? Creo que 'NSInteger hour = [componentes hora]; NSInteger minute = [componentes por minuto]; ' sería suficiente? – Toolism

+0

Gracias. Corregido – HenryRootTwo

+0

¿Cómo obtener AM o PM? – Singapore

3

Si se va a utilizar la biblioteca C, entonces esto podría hacerse:

time_t t; 
struct tm * timeinfo; 

time (&t); 
timeinfo = localtime (&t); 

NSLog(@"Hour: %d Minutes: %d", timeinfo->tm_hour, timeinfo->tm_min); 
Y el uso de

Swift:

var t = time_t() 
time(&t) 
let x = localtime(&t) 

println("Hour: \(x.memory.tm_hour) Minutes: \(x.memory.tm_min)") 

Para mayor información ver: orientación: http://www.cplusplus.com/reference/ctime/localtime/

2

Swift 2.0

let dateNow = NSDate() 
    let calendar = NSCalendar.currentCalendar() 
    let hour = calendar.component(NSCalendarUnit.Hour, fromDate: dateNow) 
    let minute = calendar.component(NSCalendarUnit.Minute, fromDate: dateNow) 
    print(String(hour)) 
    print(String(minute)) 

Por favor, hacer tomar nota de que el molde de cadena en el estado de impresión, puede asignar fácilmente que el valor de las variables, así:

var hoursString = String(hour) 
var minutesString = String(minute) 

A continuación, puede concatenar los valores de la siguiente manera:

var compoundString = "\(hour):\(minute)" 
print(compoundString) 
4

con iOS 8, Apple introdujo un método de ayuda para recuperar el hour, minute, second y nanosecond de un objeto NSDate.

Objective-C

NSDate *date = [NSDate currentDate]; 
NSInteger hour = 0; 
NSInteger minute = 0; 
NSCalendar *currentCalendar = [NSCalendar currentCalendar]; 
[currentCalendar getHour:&hour minute:&minute second:NULL nanosecond:NULL fromDate:date]; 
NSLog(@"the hour is %ld and minute is %ld", (long)hour, (long)minute); 

Swift

let date = NSDate() 
var hour = 0 
var minute = 0 
let calendar = NSCalendar.currentCalendar() 
if #available(iOS 8.0, *) { 
    calendar.getHour(&hour, minute: &minute, second: nil, nanosecond: nil, fromDate: date) 
    print("the hour is \(hour) and minute is \(minute)") 
} 
3

Swift 2.0

Usted puede hacer lo siguiente para obtener horas y minutos a partir de una fecha:

let dateFromat = NSDateFormatter() 
dateFromat.dateFormat = "hh:mm a" 
let date = dateFromat.dateFromString(string1) // In your case its string1 
print(date) // you will get - 11:59 AM 
+0

Utilice [NSDateFormatter] (http://www.codingexplorer.com/swiftly-getting-human-readable-date-nsdateformatter/) para obtener detalles breves. –

+0

El formato correcto es single 'h: mm a' –

Cuestiones relacionadas