从TimeSpan小时计算天数

时间:2013-08-20 10:02:49

标签: c# timespan

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

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

 TimeSpan estiamtedHours;

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

时间(7)字段也有24小时的限制,这是最好的方式,因为秒表在另一个表格上需要时间(7)。

由于

6 个答案:

答案 0 :(得分:4)

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

TimeSpan estiamtedHours;

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

答案 1 :(得分:3)

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

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

你也可以用分钟和秒来做同样的事情。或者,如果您只想要几个小时,则可以使用TimeSpan.FromHours而不是TimeSpan构造函数来使用{{1}}。

答案 2 :(得分:1)

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

double hours
if (double.TryParse(tbEstHours.Text, out hours)
{
    TimeSpan time = TimeSpan.FromHours(hours);
}

答案 3 :(得分:1)

TimeSpan.Parse Method期望以

格式输入
  

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

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

例如,

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

如果您只是希望用户输入数小时,您可以简单地将输入解析为整数并从中构建TimeSpan:

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

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

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

答案 4 :(得分:1)

由于其他答案没有解决这个问题

此处的关注点是数据库中的时间列,并且预计有效时间为limited to the 24 hr时间,而TimeSpan可以超过24小时限制。

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

答案 5 :(得分:1)

小心点。 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 TimeSpan.Ticks类型存储bigint的完整精度。但是,您可能会使用TimeSpan.TotalSeconds存储int。加载时,您可以使用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