J'ai une zone de texte qui a ce texte 25:00:00. Cela représente 25 heures. J'essaie de convertir ce texte en une période avec ce code:

TimeSpan tTime = TimeSpan.Parse(man_hours_nbr.Text);

        double sum10 = tTime.TotalHours;
        hours = Convert.ToDecimal(sum10);

Le problème est que tTime voit 25 jours (600 heures) au lieu de 25 heures. Pourquoi lit-il 25 jours ?? J'ai alors besoin de la période sous forme décimale pour qu'elle puisse être affichée comme telle. Qu'est-ce que je fais mal? Merci

1
Christian Verner 20 nov. 2018 à 17:18

4 réponses

Meilleure réponse

Vous pouvez le faire comme ceci:

string[] splitTime = man_hours_nbr.Text.Split(':');
int hours = Int32.Parse(splitTime[0]);
int minutes = Int32.Parse(splitTime[1]);
int seconds = Int32.Parse(splitTime[2]);
double totalHours = hours + minutes / 60.0 + seconds / 3600.0;

Je divise simplement le texte par deux points, en ses parties. Ensuite, analysez les valeurs et ajoutez-les ensemble à la fin.

2
Poul Bak 20 nov. 2018 à 14:43

La structure TimeSpan a limites aux valeurs qui peuvent être utilisées Christian. Vous pouvez le faire (illustré ci-dessous) à la place si vous ne saisissez que les heures de travail dans votre zone de texte. Pour plus de simplicité, j'omets les vérifications d'erreur évidentes telles que les valeurs minimales maximales et les valeurs nulles.

var textBoxValue = "25:20:00";
var hours = int.Parse(textBoxValue.Split(':')[0]) + int.Parse(textBoxValue.Split(':')[1])/60d + int.Parse(textBoxValue.Split(':')[2]) / 3600d;
1
S Nimalan 20 nov. 2018 à 15:17

Comme certains l'ont souligné dans les commentaires, vous ne pouvez pas analyser directement 25 heures. Mais ce que vous pouvez faire, c'est analyser les heures en jours, puis obtenir le total des heures à partir du TimeSpan. Dans le même ordre d'idées:

TimeSpan ts = TimeSpan.ParseExact(stringValue, @"dd\:hh\:mm\:ss", null);
double hours = ts.TotalHours;

La chaîne @ "dd ..." est le format de l'entrée où "d" signifie jour, "h" pour heure, "m" pour minute et "s" pour seconde. Donc, votre entrée serait "01: 01: 00: 00" pour 1 jour et 1 heure (25 heures au total)

-1
MindSwipe 20 nov. 2018 à 14:28

TimeSpan.ParseExact prend l'heure de l'horloge et non la quantité de temps. Par conséquent, vous ne pouvez pas l'utiliser pour vos besoins. D'après ce que je comprends, vous voulez obtenir le nombre total d'heures à partir d'une chaîne spécifiée au format «heures: minutes: secondes». J'espère que le code ci-dessous vous aidera à résoudre le problème. Des réponses ont déjà été publiées. Le code suivant est quelque chose que j'aurais fait si confronté au problème.

Cette ligne dans votre code

var hours = GetHours(man_hours_nbr.Text);

Voici la méthode GetHours

public static double GetHours(string timeString)
{
    var splitTime = timeString.Split(':');
    if (splitTime.Length != 3)
        throw new ArgumentException("Time string not in format HH:MM:SS");

    var hours = Convert.ToDouble(splitTime[0]);
    var mins = Convert.ToDouble(splitTime[1]);
    var seconds = Convert.ToDouble(splitTime[2]);

    var time = new TimeSpanBuilder()
        .WithHours(hours)
        .WithMinutes(mins)
        .WithSeconds(seconds)
        .Build();

    return time.TotalHours;
}

Voici la classe TimeSpanBuilder, (utilise le modèle de générateur)

public class TimeSpanBuilder
{
    private TimeSpan _ts = TimeSpan.Zero;

    public TimeSpanBuilder WithHours(double hours)
    {
        _ts = _ts.Add(TimeSpan.FromHours(hours));
        return this;
    }

    public TimeSpanBuilder WithMinutes(double mins)
    {
        _ts = _ts.Add(TimeSpan.FromMinutes(mins));
        return this;
    }
    public TimeSpanBuilder WithSeconds(double seconds)
    {
        _ts = _ts.Add(TimeSpan.FromMinutes(seconds));
        return this;
    }

    public TimeSpan Build()
    {
        return _ts;
    }
}
0
Mach 20 nov. 2018 à 16:20