Comment puis-je obtenir des heures et des minutes de NSDate?

113

Dans mon application, j'ai besoin d'obtenir l'heure et les minutes séparément:

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

Considérez string1contient 11:59:13 AMqui provient de datepicker.

Ici, si j'utilise le code ci-dessus, il est normal d'obtenir l'heure si elle est supérieure à 9. Sinon, je dois changer NSMakeRange(0,1)pour obtenir l'heure entre 1 et 9.

Existe-t-il des méthodes pour obtenir l'heure, les minutes, etc.?

Merci d'avance, veuillez me fournir un exemple de code.

Mac
la source

Réponses:

262

Utilisez un NSDateFormatter pour convertir string1en un NSDate, puis obtenez les NSDateComponents requis :

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

Plus d'informations sur le format de date sur le site officiel Unicode

Thomas Müller
la source
Salut Encore un doute, est-il possible de changer l'heure, la minute dans NSDate
mac
Pour changer l'heure et les minutes, regardez peut-être dans NSDate + dateWithTimeIntervalSinceReferenceDate :. Cette méthode vous permet d'ajouter un nombre spécifique de secondes à ce jour (et de renvoyer une nouvelle date).
Thomas Müller
Sur iOS, "composants" n'est disponible que depuis la version 8.0. Que diriez-vous de <8,0?
Rhuantavan
2
@Rhuantavan developer.apple.com/library/ios/documentation/Cocoa/Reference/… : "Disponible dans iOS 2.0 et versions ultérieures." J'utilise définitivement cette API depuis des années.
Thomas Müller
Je suppose que c'est un bogue dans XCode car il signalait que c'était 8.0. J'aurais dû vérifier les sources ou les documents en ligne. Ma faute.
Rhuantavan
52

Si vous n'en avez besoin que pour présenter sous forme de chaîne, le code suivant est beaucoup plus simple

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

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

Cela me semble être la question après, pas besoin de formateurs:

NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:date];
NSInteger hour = [components hour];
NSInteger minute = [components minute];
HenryRootDeux
la source
1
Comment obtenir AM ou PM?
Yalamandarao le
4

Si vous deviez utiliser la bibliothèque C, cela pourrait être fait:

time_t t;
struct tm * timeinfo;

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

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

Et en utilisant Swift:

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

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

Pour plus d'informations, voir: http://www.cplusplus.com/reference/ctime/localtime/

SommaireTech
la source
4

Avec iOS 8, Apple a introduit une méthode d'aide pour récupérer le hour, minute, secondet nanosecondd'un objet NSDate.

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

Rapide

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)")
}
nouveauDéveloppeur
la source
3

Swift 2.0

Vous pouvez faire la chose suivante pour obtenir des heures et des minutes à partir d'une date:

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
la source
Utilisez NSDateFormatter pour de brefs détails.
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))

Veuillez prendre note de la conversion en String dans l'instruction d'impression, vous pouvez facilement affecter cette valeur à des variables, comme ceci:

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

Ensuite, vous pouvez concaténer des valeurs comme ceci:

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