Проблема конверсии TimeSpan (указание дней вместо часов) - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть текстовое поле с этим текстом 25:00:00.Это составляет 25 часов.Я пытаюсь преобразовать этот текст в промежуток времени с таким кодом:

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

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

Проблема в том, что tTime видит 25 дней (600 часов) вместо 25 часов.Почему он читает 25 дней?Затем мне нужно время в десятичном формате, чтобы он мог отображаться как таковой.Что я делаю неправильно?Спасибо

Ответы [ 4 ]

0 голосов
/ 20 ноября 2018

TimeSpan.ParseExact принимает время часов, а не количество времени.Следовательно, вы не можете использовать его по вашему требованию.Из того, что я понимаю, вы хотите получить общее количество часов из указанной строки в формате «часы: минуты: секунды».Надеюсь, что приведенный ниже код поможет вам решить проблему.Там уже были опубликованы ответы.Следующий код - это то, что я бы сделал, если бы столкнулся с проблемой.

Эта строка в вашем коде

var hours = GetHours(man_hours_nbr.Text);

Вот метод 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;
}

Воткласс TimeSpanBuilder, (использует шаблон построителя)

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 голосов
/ 20 ноября 2018

Вы можете сделать это так:

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;

Я просто делю текст по двоеточию на части.Затем проанализируйте значения и сложите их вместе в конце.

0 голосов
/ 20 ноября 2018

Структура TimeSpan имеет ограничения на значения, которые могут использоваться христианскими.Вы можете сделать это (показано ниже) вместо этого, если вы только фиксируете человеко-часы в своем текстовом поле.Для простоты я опускаю очевидные проверки ошибок, такие как max min значения и нули.

var textBoxValue = "25:20:00";
var hours = int.Parse(textBoxValue.Split(':')[0]) + int.Parse(textBoxValue.Split(':')[1])/60d + int.Parse(textBoxValue.Split(':')[2]) / 3600d;
0 голосов
/ 20 ноября 2018

Как некоторые отмечали в комментариях, вы не можете напрямую анализировать 25 часов.Но вы можете проанализировать часы и дни, а затем получить общее количество часов из TimeSpan.Вдоль таких строк:

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

Строка @ "dd ..." - это формат ввода, где "d" обозначает день, "h" - час, "m" - минуту и«с» для второго.Таким образом, ваш ввод будет «01: 01: 00: 00» в течение 1 дня и 1 часа (всего 25 часов)

...