从TimeSpan小时计算天数

本文关键字:计算 小时 TimeSpan | 更新日期: 2023-09-27 18:28:15

我有一个单独的文本框,用户将在其中输入小时数。目前,如果他们输入26小时,由于TimeSpan的HH限制,我们会得到一个错误。此值将存储在SQL Server 2008时间(7)字段中。

我怎样才能让它识别超过23个小时?不能将其存储为十进制,因为程序的另一部分要求此字段为时间(7)字段。

 TimeSpan estiamtedHours;
 private void btnSave_Click(object sender, EventArgs e)
 {
     estimatedHours = TimeSpan.Parse(tbEstHours.Text);
 }

时间(7)字段也有24小时的限制,最好的方法是什么,因为在另一个表单上的秒表需要时间(7

感谢

从TimeSpan小时计算天数

如果您知道输入值是作为浮点数的小时值,则可以使用TimeSpan.FromHours():

TimeSpan estiamtedHours;
private void btnSave_Click(object sender, EventArgs e)
{
  estimatedHours = TimeSpan.FromHours(Double.Parse(tbEstHours.Text));
}

将文本解析为int,并将该int作为TimeSpan构造函数中的hours参数传递。

int hours;
if (Int32.TryParse(tbEstHours.Text, out hours))
{
    TimeSpan ts = new TimeSpan(hours, 0, 0);
}

你也可以用分秒来做同样的事情。或者,如果您只需要小时,可以以相同的方式使用TimeSpan.FromHours,而不是TimeSpan构造函数。

小心。TimeSpan用于测量经过的持续时间,而SQL Server中的time专门用于测量一天中的时间。这是两个不同的概念。

有时这些会混淆。例如,DateTime.TimeOfDayTimeSpan类型,这与它的设计背道而驰。这是一个合理的折衷方案,因为.Net中没有Time类型,并且它可以适应

但是,24小时或更长时间的TimeSpan不适合SQL Server time字段。

此外,TimeSpan是以标准天数为基础的。您可以用TimeSpan.FromHours(26)创建一个,它将代表"1天2小时"。如果您调用TimeSpan.FromHours(26).ToString(),它将是"1.02:00:00"

如果要存储经过的时间(而不是一天中的某个时间),请在.Net中使用TimeSpan,但在SQL Server中使用整数类型。决定你想要精度的单位,这将有助于你选择数据类型。

例如,可以使用SQL Server bigint类型存储TimeSpan.Ticks的全部精度。但您可能会使用int存储TimeSpan.TotalSeconds。加载时,可以使用TimeSpan.FromSeconds返回到TimeSpan类型。

还要注意,TimeSpan可以是,这表示在时间上向后移动。

顺便说一句,如果您使用Noda Time库,这些概念将在称为DurationLocalTime的类型中分离。

如果你想要的是一种解析像"26:00:00"这样的字符串的方法,那么就不能用TimeSpan来做。但是可以使用Noda Time:

// starting from this string
string s = "26:00:00";
// Parse as a Duration using the Noda Time Pattern API
DurationPattern pattern = DurationPattern.CreateWithInvariantCulture("H:mm:ss");
Duration d = pattern.Parse(s).Value;
Debug.WriteLine(pattern.Format(d));  // 26:00:00
// if you want a TimeSpan, you can still get one.
TimeSpan ts = d.ToTimeSpan();
Debug.WriteLine(ts);  // 1.02:00:00

解析输入后,使用FromHours方法:

double hours
if (double.TryParse(tbEstHours.Text, out hours)
{
    TimeSpan time = TimeSpan.FromHours(hours);
}
TimeSpan.Parse方法需要格式的输入

[ws][-]{d|[d.]hh:mm[:ss[.ff]]}[ws]

其中hh是小时部分,范围从0到23。

例如,

  • CCD_ 31返回5天
  • TimeSpan.Parse("5:14")返回5小时14分钟

如果你只想让用户输入小时数,你可以简单地将输入解析为一个整数,并从中构建一个TimeSpan:

TimeSpan result = TimeSpan.FromHours(int.Parse("26"));
// result == {1.02:00:00}

(使用int.TryParse进行用户输入。)

如果您希望用户同时输入小时和分钟(例如26:14),那么您需要自己实现一些解析方法。

由于其他答案不涉及此

这里关注的是数据库中的时间列,它期望一个有效的持续时间,该持续时间将限制在24小时内,因为TimeSpan可以使它们超过24小时的限制。

因此,理想情况下应该将值解析为int(使用int.Parseint.TryParse),然后检查它是否小于24,然后创建适当的TimeSpan