2015-09-11 1 views
26

Fondamentalement ce que je veux est d'obtenir la valeur d'un intervalle de temps représenté en heures seulement, sans l'arrondir à des heures complètes (en utilisant NSDateComponentsFormatter pour le faire correctement formaté et localisé). Je ne sais pas si j'ai mal compris l'utilisation de NSDateComponentsFormatter.allowsFractionalUnits, mais je ne peux pas obtenir le formatter pour me donner une valeur décimale. Quelqu'un peut-il m'aider à repérer mon erreur ou me dire de quelle manière je me méprends?Qu'est-ce que je fais de mal avec allowFractionalUnits sur NSDateComponentsFormatter?

A partir de documents d'Apple sur allowsFractionalUnits propriété:

Les fractions de part peuvent être utilisées lorsqu'une valeur ne peut pas être exactement représentés en utilisant les unités disponibles. Par exemple, si les minutes ne sont pas autorisées, la valeur "1h 30m" peut être formatée comme "1.5h".

exemple de code Swift:

let formatter = NSDateComponentsFormatter() 
formatter.unitsStyle = .Abbreviated 
formatter.allowedUnits = .Hour 
formatter.allowsFractionalUnits = true 

let onePointFiveHoursInSeconds = NSTimeInterval(1.5 * 60.0 * 60.0) 
print(formatter.stringFromTimeInterval(onePointFiveHoursInSeconds)!) 
//"1h" instead of expected "1.5h" 

Même exemple dans le code Objective-C:

NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init]; 
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleAbbreviated; 
formatter.allowedUnits = NSCalendarUnitHour; 
formatter.allowsFractionalUnits = YES; 

NSTimeInterval onePointFiveHoursInSeconds = 1.5 * 60.0 * 60.0; 
NSLog(@"%@", [formatter stringFromTimeInterval:onePointFiveHoursInSeconds]); 
//"1h" instead of expected "1.5h" 

Mise à jour: J'ai signalé un bug à Apple à propos de ce problème (rdar://22660145).

+2

Problème intéressant. Il semble que allowsFractionalUnits ne fonctionne pas du tout. –

+0

Je pense que c'est fondamentalement une mauvaise idée. Par exemple, 1.33h, combien ça coûte? Cela pourrait être trompeur dans le cas où il est formaté pour l'utilisateur final. Je préfère afficher 1:20 – Prcela

+0

@Prcela: Ceci est mon exemple simplifié, ma motivation pour l'utiliser est un peu hors de propos ici. Comme il est documenté que NSDateComponentsFormatter est supposé supporter ceci, il devrait être possible d'obtenir cette sortie. – osanoj

Répondre

0

Aussi simple que cela (je viens de minutes spécifié comme l'une des unités autorisées pour votre formatter):

let formatter = NSDateComponentsFormatter() 
formatter.unitsStyle = .Abbreviated 
formatter.allowedUnits = [.Hour, .Minute] // specify minutes so that fractions of hours (minutes, in fact) don't get truncated 
formatter.allowsFractionalUnits = true 

let onePointFiveHoursInSeconds = NSTimeInterval(1.5 * 60.0 * 60.0) 
print(formatter.stringFromTimeInterval(onePointFiveHoursInSeconds)!) 
+0

La sortie est toujours '1h 30m', pas' 1.5h' comme OP demande. – Moritz

+0

Vous avez raison. C'était trop facile. Ensuite, creusera plus profond. –

+0

J'ai fait des tonnes de tests et ça n'a jamais marché. Martin R. pourrait avoir raison. – Moritz

-5

entrez le code TTENDU j'ai bien compris, vous voulez afficher l'heure dans formate 12 heures Droite ? Voici le code: Swift->

let dateAsString = "20:30" 
let dateFormatter = NSDateFormatter() 
dateFormatter.dateFormat = "HH:mm" 
let date = dateFormatter.dateFromString(dateAsString) 

dateFormatter.dateFormat = "h:mm a" 
let date12 = dateFormatter.stringFromDate(date!) 
txtText.text = date12 
+0

Qu'est-ce que cela a à voir avec la question? – rmaddy

2

En regardant le documentation, il utilise beaucoup de langue intéressante (Souligné par l'auteur):

unités fractionnaires peut être utilisé lorsqu'une valeur ne peut pas être représentée exactement en utilisant les unités disponibles. Par exemple, si les minutes ne sont pas autorisées, la valeur "1h 30m" peut être au format "1.5h".

Alors que pour moi, il semble que ce serait logique pour les valeurs de la documentation à des valeurs qui fonctionnent réellement, il est certainement possible qu'il y ait une combinaison de valeur temps, les options de formatage et calendrier/paramètres régionaux cela ferait ce travail. Vaut vraiment la peine de déposer un radar sur la fonctionnalité et la documentation.

+0

Je n'ai pas encore progressé dans mon rapport de bogue, donc si quelqu'un a envie de déposer un radar, faites-le, car cela pourrait attirer l'attention d'Apple sur ce problème. – osanoj

0

Selon Open Radar #32024200:

Après avoir fait quelques recherches (désassemblage Foundation), il semble que chaque appel - [_ unitFormatter stringFromNumber:] dans - [NSDateComponentsFormatter _stringFromDateComponents:] est passé un + [NSNumber numberWithInteger: ] qui laisse tomber les données en virgule flottante.

Vous ne faites rien de mal. Le drapeau est simplement cassé.