Temps d’parsing supérieurs à 24 heures en C #

Supposons un horodatage (uniquement l’heure ou la date et l’heure) où l’heure peut se reporter au jour suivant:

00:00:00 <- minuit

01:00:00 <- 1 heure

23:00:00 <- 23 heures

24:00:00 <- minuit, jour + 1

25:00:00 <- 1 heure du matin, jour + 1

Quel serait un moyen de l’parsingr facilement dans un DateTime C # qui effectuerait le report au lendemain? En d’autres termes, “01:00:00” deviendrait “0001-01-01 01:00:00” et “25:00:00”, “0001-01-02 01:00:00”.

MODIFIER:

Je devrais mentionner que cela échoue lamentablement (ie FormatException):

DateTime.ParseExact("0001-01-01 25:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); 

Puisque vous essayez de représenter une période de temps à partir d’un point arbitraire, plutôt que comme une date spécifique, vous feriez peut-être mieux d’utiliser la classe System.TimeSpan ? Cela vous permet de définir des valeurs de plus de 24 heures dans le constructeur et peut être utilisé avec des objects DateTime comme ceci:

 System.TimeSpan timestamp = new System.TimeSpan(25, 0, 0); System.DateTime parsedDateTime = new DateTime(0, 0, 0); parsedDateTime = parsedDateTime.Add(timestamp); Console.WriteLine(parsedDateTime.ToSsortingng("yyyy-MM-dd HH:mm:ss")); //Output as "0001-01-02 01:00:00" 

REMARQUE: le code n’a pas été testé.

EDIT: En termes d’parsing des chaînes, je ne vois aucun object .NET de base analysant des chaînes avec des valeurs supérieures à 23 pour l’heure (car 25 est une heure invalide de la journée), mais en supposant que le format soit cohérent. , vous pouvez créer une routine d’parsing de chaîne très simple (ou même une expression régulière) pour lire les valeurs individuellement et charger le constructeur manuellement.

Si vous pouvez append une valeur DateTime existante, vous pouvez toujours utiliser TimeSpan:

 ssortingng dt = "25:00:00"; int hours = int.Parse(dt.Split(':')[0]); TimeSpan ts = TimeSpan.FromHours(hours); 

TimeSpan.Parse() ne fonctionne pas directement dans ce cas car il se plaint (assez bien!) De la notation 25 dans l’heure.

Au cas où personne ne signalerait une réponse immédiate, voici une classe ActionScript soignée que j’ai écrite pour parsingr les entrées de temps (entrée humaine) …

https://github.com/appcove/AppStruct/blob/master/Flex/AppStruct/src/AppStruct/TimeInput.as

Il serait très simple de porter cela en C #, et vous pourriez modifier la logique des 24 heures pour obtenir #days, #heures, #minutes.

Bonne chance!

Vous spécifiez une date invalide. Ainsi, non seulement vous ne pouvez pas l’parsingr, mais vous ne pouvez pas le stocker!

Que diriez-vous d’un bel object TimeSpan? (Il a également une méthode Parse() .)

Vous pouvez également utiliser une fonction de type sscanf() telle que celle disponible sur http://www.blackbeltcoder.com/Articles/ssortingngs/a-sscanf-replacement-for-net pour extraire chaque nombre séparément. (Idéal si vous n’avez aucun contrôle sur le format de chaîne en cours de lecture.)

Si vous voulez le coder … ceci devrait être un sharepoint départ:

  ssortingng dateSsortingng = "0001-01-01 25:00:00"; ssortingng[] parts = dateSsortingng.Split(' '); //now have '0001-01-01' and '25:00:00' ssortingng datePart = parts[0]; // '0001-01-01' ssortingng[] timeParts = parts[1].Split(':'); //now have '25', '00', and '00 DateTime initialDate = DateTime.ParseExact(datePart, "yyyy-MM-dd", CultureInfo.InvariantCulture);//use the date as a starting point //use the add methods to get your desired datetime int hours = int.Parse(timeParts[0]); int minutes = int.Parse(timeParts[1]); int seconds = int.Parse(timeParts[2]); DateTime resultDate = initialDate.AddHours(hours) .AddMinutes(minutes) .AddSeconds(seconds); 

Bien sûr, il suppose que l’entrée est correctement formatée et analysable, etc. De plus, vous pouvez certainement utiliser la période de temps au lieu des méthodes d’ajout individuelles pour heure, minute, seconde comme le sont d’autres réponses.