Supposons un horodatage (juste heure ou heure et heure) où le temps peut rouler jusqu'au lendemain:
00:00:00
01:00:00
23:00:00
24:00:00
25:00:00 blockQuote>
Quelle serait un moyen de l'analyser facilement dans une date d'heure C # qui effectuerait le report jusqu'au lendemain? En d'autres termes, "01:00:00" deviendrait "0001-01-01 01:00:00" et "25:00:00" deviendrait "0001-01-02 01:00:00". p>
EDIT: P>
Je devrais mentionner que cela échoue de manière misérablement (c.-à-d. FormatException): P>
DateTime.ParseExact("0001-01-01 25:00:00", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
5 Réponses :
Vous spécifiez une date non valide. Donc, non seulement vous ne pouvez pas l'analyser, vous ne pouvez pas le stocker! P>
Que diriez-vous d'un bel objet Timespan à la place? (Il dispose également d'une méthode Alternativement, utilisez un parse () code>.) P>
SSCANF () code> -Type fonction comme celui à http://www.blackbeltcoder.com/articles/strings/a-sscanf-replacement-for-net Pour extraire chaque numéro séparé. (Meilleur si vous n'avez aucun contrôle sur le format de la chaîne en cours de lecture.) P>
La méthode TimesPan.Parse jette une exception OverflowException sur l'analyse "25:00:00".
@MPelletier: S'il vous plaît voir le lien que j'ai ajouté à ma réponse. Si le format est non standard et que vous ne pouvez pas modifier cela, vous devrez extraire les valeurs séparément.
Si personne ne pointe une réponse hors de la case, voici une classe ActionScript NEAT ID que j'ai écrit pour analyser les entrées de temps (entrée humaine) ... p>
Il serait très simple de porter cela à C #, et vous pourriez modifier la logique de 24 heures pour aboutir à #Days, #hours, #minutes. P>
bonne chance! p>
Puisque vous essayez de représenter une période de temps d'un point arbitraire, plutôt que comme une date précise, vous seriez peut-être préférable d'utiliser le System.Timespan classe? Cela vous permet de définir des valeurs de plus de 24 heures dans le constructeur et peut être utilisée avec des objets DateTime comme celui-ci:
System.TimeSpan timestamp = new System.TimeSpan(25, 0, 0);
System.DateTime parsedDateTime = new DateTime(0, 0, 0);
parsedDateTime = parsedDateTime.Add(timestamp);
Console.WriteLine(parsedDateTime.ToString("yyyy-MM-dd HH:mm:ss")); //Output as "0001-01-02 01:00:00"
Vous faites un bon point, c'est vraiment l'heure d'un point arbitraire (disons minuit, mais tous les jours), alors la tempier est bien approprié.
Si vous avez une valeur DateTime existante, vous pouvez l'ajouter à, vous pouvez toujours utiliser un TIMPAN:
string dt = "25:00:00";
int hours = int.Parse(dt.Split(':')[0]);
TimeSpan ts = TimeSpan.FromHours(hours);
Si vous voulez le coder ... Cela devrait être un point de départ: bien sûr, il fait des hypothèses que l'entrée est formatée correctement et est analyable, etc.
De plus, vous pouvez certainement utiliser Timespan au lieu des méthodes d'addition individuelles d'heure, minute, deuxième, car d'autres réponses sont. P> P>
Pour ceux qui seraient curieux de cette notation, il est parfois utilisé par les autorités de transit pour désigner la journée d'exploitation après minuit.
Quelle est la chaîne réelle i> que vous devez analyser? Ce n'est pas 0001-01-01 25:00:00 J'en suis sûr.
@Hanspassant: Non, c'est vraiment "25:00:00". Je viens de mettre la date dans mon code d'échantillon pour ne pas le rendre par défaut à la date actuelle. Désolé si cela est déroutant.
Juste l'analyser avec une regex et trois int.parse ().
@Hanspassant: Oui, on dirait que je vais aller de la sorte. Je me demandais simplement s'il y avait quelque chose de hors de la même boîte dans DateTime qui a permis de cela.