2

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

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

 TimeSpan estiamtedHours;

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

time(7) 字段也有 24 小时的限制,最好的方法是解决这个问题,因为另一种形式的秒表需要 Time(7)。

谢谢

4

6 回答 6

4

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

TimeSpan estiamtedHours;

private void btnSave_Click(object sender, EventArgs e)
{
  estimatedHours = TimeSpan.FromHours(Double.Parse(tbEstHours.Text));
}
于 2013-08-20T10:06:45.810 回答
3

将文本解析为 anint并将其int作为hours参数传递给 TimeSpan 构造函数。

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

您也可以对分钟和秒执行相同操作。或者,如果您只想要几个小时,您可以TimeSpan.FromHours以相同的方式使用而不是TimeSpan构造函数。

于 2013-08-20T10:05:18.163 回答
1

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

这里关注的是数据库中的时间列,它需要一个有效的持续时间,该持续时间将限制为 24 小时时间,而TimeSpan它们可以超过 24 小时的限制。

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

于 2013-08-20T10:28:32.913 回答
1

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

double hours
if (double.TryParse(tbEstHours.Text, out hours)
{
    TimeSpan time = TimeSpan.FromHours(hours);
}
于 2013-08-20T10:07:21.817 回答
1

TimeSpan.Parse 方法期望输入格式为

[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),那么您需要自己实现一些解析方法。

于 2013-08-20T10:07:34.013 回答
1

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

有时这些会混淆。例如,DateTime.TimeOfDay是一种TimeSpan类型——这违背了它的设计。这是一个合理的折衷方案,因为 .Net 中没有Time类型,它可以适合.Net 。

但是TimeSpan24 小时或更长的时间适合 SQL Servertime字段。

此外,aTimeSpan基于标准天数。您可以创建一个,TimeSpan.FromHours(26)它将代表“1 天 2 小时”。如果你打电话给TimeSpan.FromHours(26).ToString()"1.02:00:00"

如果要存储经过的持续时间(不是一天中的某个时间),则TimeSpan在 .Net 中使用 a,但在 SQL Server 中使用整数类型。确定您想要精度的单位,这将帮助您选择数据类型。

例如,您可以存储TimeSpan.Ticks使用 SQL Serverbigint类型的完整精度。但可能你会TimeSpan.TotalSeconds使用int. 加载时,您可以使用TimeSpan.FromSeconds来返回一个TimeSpan类型。

还要注意 aTimeSpan可以是负数,表示时间倒退。

顺便说一句,如果您使用Noda Time库 - 这些概念将为您分开称为Duration和的类型LocalTime

如果您所追求的是一种解析字符串的方法,就像"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
于 2013-08-20T21:45:35.417 回答