我有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)。
由于
答案 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)
[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.Parse
或int.TryParse
),然后检查它是否小于24,然后创建相应的TimeSpan
答案 5 :(得分:1)
小心点。 TimeSpan
用于衡量经过的持续时间,而SQL Server中的time
特别是一个时间。这是两个不同的概念。
有时这些混淆了。例如,DateTime.TimeOfDay
是TimeSpan
类型 - 这与其设计背道而驰。这是一个合理的妥协,因为.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库,那么这些概念将在名为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