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;
}
}
我有一个包含此文本 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;
}
}