Como obtenho horas e minutos de NSDate?

113

Em meu aplicativo, preciso obter a hora e o minuto separadamente:

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

Considere o string1conteúdo 11:59:13 AMque está vindo de datepicker.

Aqui, se eu usar o código acima, não há problema em obter a hora se for maior que 9. Caso contrário, preciso alterar NSMakeRange(0,1)para obter a hora entre 1 e 9.

Existe algum método para obter a hora, os minutos, etc.?

Agradecemos antecipadamente, forneça-me o código de amostra.

Mac
fonte
Possível duplicata de Como obter a hora do dia com o Swift?
J-Dizzle de

Respostas:

262

Use um NSDateFormatter para converter string1em um e NSDate, em seguida, obtenha os NSDateComponents necessários :

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

Mais sobre o dateformat está no site oficial unicode

Thomas Müller
fonte
Oi mais uma dúvida, é possível mudar a hora, minuto no NSDate
mac
Para alterar a hora e o minuto, talvez dê uma olhada em + dateWithTimeIntervalSinceReferenceDate: de NSDate :. Esse método permite adicionar uma quantidade específica de segundos à data (e retornar uma nova data).
Thomas Müller
No iOS, "componentes" está disponível apenas a partir da versão 8.0. Que tal <8,0?
Rhuantavan
2
@Rhuantavan developer.apple.com/library/ios/documentation/Cocoa/Reference/… : "Disponível no iOS 2.0 e posterior." Definitivamente, uso essa API há anos.
Thomas Müller
Eu acho que é um bug no XCode, já que estava relatando que era 8.0. Eu deveria ter verificado as fontes ou documentos online. Foi mal.
Rhuantavan
52

Se você só precisa dele para apresentar como uma string, o código a seguir é muito mais fácil

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

NSString *startTimeString = [formatter stringFromDate:startTimePicker.date];
Gil Margolin
fonte
45

Parece-me que é essa a questão, sem necessidade de formatadores:

NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:date];
NSInteger hour = [components hour];
NSInteger minute = [components minute];
HenryRootTwo
fonte
1
Como obter AM ou PM?
Yalamandarao
4

Se você fosse usar a biblioteca C, isso poderia ser feito:

time_t t;
struct tm * timeinfo;

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

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

E usando o Swift:

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

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

Para obter mais orientações, consulte: http://www.cplusplus.com/reference/ctime/localtime/

SketchyTech
fonte
4

Com iOS 8, a Apple introduziu um método auxiliar para recuperar o hour, minute, seconde nanosecondde um 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);

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)")
}
newDeveloper
fonte
3

Swift 2.0

Você pode fazer o seguinte para obter horas e minutos de uma data:

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
fonte
Use NSDateFormatter para detalhes 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))

Observe a conversão em String na instrução de impressão, você pode facilmente atribuir esse valor a variáveis, como este:

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

Então você pode concatenar valores como este:

var compoundString = "\(hour):\(minute)"
print(compoundString)
Juan Boero
fonte