¿Cómo obtengo horas y minutos de NSDate?


113

En mi aplicación, necesito obtener la hora y los minutos por separado:

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

Considere el string1contenido 11:59:13 AMque proviene de datepicker.

Aquí, si utilizo el código anterior, está bien obtener la hora si es mayor que 9. De lo contrario, necesito cambiar NSMakeRange(0,1)para obtener la hora entre 1 y 9.

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

Gracias de antemano, proporcione un código de muestra.


Respuestas:


262

Use un NSDateFormatter para convertir string1en un NSDate, luego obtenga los NSDateComponents requeridos :

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 sobre el formato de fecha está en el sitio oficial de Unicode


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

Para cambiar la hora y los minutos, quizás mire en NSDate + dateWithTimeIntervalSinceReferenceDate :. Ese método le permite agregar una cantidad específica de segundos hasta la fecha (y devolver una nueva fecha).
Thomas Müller

En iOS, los "componentes" solo están disponibles desde la versión 8.0. ¿Qué tal <8.0?
Rhuantavan

2
@Rhuantavan developer.apple.com/library/ios/documentation/Cocoa/Reference/… : "Disponible en iOS 2.0 y posterior". Definitivamente he usado esta API durante años.
Thomas Müller

Supongo que es un error en XCode ya que informaba que era 8.0. Debería haber comprobado las fuentes o los documentos en línea. Culpa mía.
Rhuantavan

52

Si solo lo necesita para presentarlo 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];

45

Me parece que esto es lo que sigue la pregunta, sin 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];

1
¿Cómo llegar AM o PM?
Yalamandarao


4

Si tuviera que usar la biblioteca C, 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 usando Swift:

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

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

Para obtener más orientación, consulte: http://www.cplusplus.com/reference/ctime/localtime/


4

Con iOS 8, Apple introdujo un método de ayuda para recuperar el hour, minute, secondy nanosecondde un objeto NSDate.

C objetivo

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);

Rápido

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

Puede hacer lo siguiente para obtener horas y minutos 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

Utilice NSDateFormatter para obtener detalles breves.
yo2bh

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))

Tome nota de la conversión a String en la declaración de impresión, puede asignar fácilmente ese valor a variables, como esta:

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

Entonces puede concatenar valores como este:

var compoundString = "\(hour):\(minute)"
print(compoundString)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.