¿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.

Mac
fuente
Posible duplicado de ¿Cómo obtener la hora del día con Swift?
J-Dizzle

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

Thomas Müller
fuente
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];
Gil Margolin
fuente
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];
HenryRootDos
fuente
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/

SketchyTech
fuente
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)")
}
nuevo Desarrollador
fuente
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
yo2bh
fuente
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)
Juan Boero
fuente