TimeSpan 转换问题(给出天数而不是小时数)

TimeSpan conversion issue (giving days instead of hours)

我有一个包含此文本 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天??然后我需要时间跨度作为小数,以便它可以这样显示。我究竟做错了什么?谢谢

正如评论中有人指出的那样,您不能直接解析 25 小时。但是您可以做的是将小时数解析为天数,然后从 TimeSpan 中获取总小时数。像这样:

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

@"dd..." 字符串是输入的格式,其中 "d" 代表天,"h" 代表小时,"m" 代表分钟,"s"第二。因此,您的输入将是“01:01:00:00”,持续 1 天 1 小时(总共 25 小时)

你可以这样做:

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;

我只是用冒号将文本分成几部分。然后解析这些值并在最后将它们相加。

TimeSpan struct 对可以使用 Christian 的值有限制。如果您只是在文本框中捕获工时,则可以改为执行此操作(如下所示)。为简单起见,我省略了明显的错误检查,例如最大最小值和空值。

var textBoxValue = "25:20:00";
var hours = int.Parse(textBoxValue.Split(':')[0]) + int.Parse(textBoxValue.Split(':')[1])/60d + int.Parse(textBoxValue.Split(':')[2]) / 3600d;

TimeSpan.ParseExact使用时钟时间而不是时间量。因此,您不能将其用于您的要求。据我了解,您想从格式为 "hours:minutes:seconds" 的指定字符串中获取总小时数。希望下面的代码可以帮助您解决问题。已经发布了答案。如果遇到问题,下面的代码是我会做的。

你代码中的这一行

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 class,(使用构建器模式)

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;
    }
}