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.


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


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

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

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/


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

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

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.