2017-08-29 4 views
1

J'utilise ce qui suit pour analyser une chaîne de temps à un TimeSpan:Parsing chaîne de temps AM/PM à TimeSpan

string[] formats = { "hhmm", "hmm", @"hh\:mm", @"h\:mm\:ss", @"h\:mm", "hh:mm tt" }; 

parseSuccess = TimeSpan.TryParseExact(value, formats, CultureInfo.CurrentCulture, TimeSpanStyles.None, out dtValue); 

Ce retourne false lorsque je tente d'analyser une valeur comme 9:00, 5 : 00 heures Quel est le problème ici?

+0

Je considérerais « 9:00 » un point ** ** dans le temps, et pas un temps ** span **. BTW, quel langage de programmation est-ce? C#? – qqilihq

+0

Oui, désolé, c'est C# – devC

+1

@qqilihq: Le problème vient de 'DateTime.TimeOfDay' dans .NET retournant un' TimeSpan'. L'API de date/heure intégrée est quelque peu problématique, IMO ... –

Répondre

5

tt n'existe pas en tant que l'un des spécificateurs de format pour custom TimeSpan format strings. Cela a du sens en ce que TimeSpan est vraiment censé être une durée, pas une valeur de l'heure du jour - il est regrettable que DateTime.TimeOfDayne retourner un TimeSpan.

Il est probablement plus simple d'analyser la valeur en tant que DateTime puis obtenir le temps de la journée de ce:

string text = "5:00 PM"; 
string[] formats = { "hhmm", "hmm", @"hh\:mm", @"h\:mm\:ss", @"h:mm", @"h:mm tt" }; 

var success = DateTime.TryParseExact(text, formats, CultureInfo.CurrentCulture, 
    DateTimeStyles.None, out var value); 
Console.WriteLine(value.TimeOfDay); 

Notez que j'ai corrigé le hh:mm tt à h:mm tt que vos données d'échantillon ne 0- rembourré. Vous voulez probablement HHmm, et HH:mm au lieu de hhmm et hh:mm ainsi, pour accepter des valeurs comme "21:00".

Vous pouvez également utiliser ma bibliothèque Noda Time qui a un certain type de temps de jour (LocalTime) qui peut être analysé directement avec un LocalTimePattern :)

+0

Cela fonctionne à peu près pour tous les formats de mon temps, mais je vois un problème étrange que les formats de temps PM échouent. Par exemple, 4h00 est accepté avant 14h00 ou 17h00 est échoué. – devC

+1

@devC avec le code * exact * fourni? Notez qu'avec les formats acceptant 'tt' vous avez besoin de 'h' plutôt que 'H'. Ça devrait aller, comme mon exemple de code. –

+0

Je vois. J'avais toujours H dans mon tableau de format. Merci beaucoup! – devC