从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.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.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 bigint
类型存储TimeSpan.Ticks
的全部精度。但您可能会使用int
存储TimeSpan.TotalSeconds
。加载时,可以使用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
解析输入后,使用FromHours
方法:
double hours
if (double.TryParse(tbEstHours.Text, out hours)
{
TimeSpan time = TimeSpan.FromHours(hours);
}
[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.Parse
或int.TryParse
),然后检查它是否小于24,然后创建适当的TimeSpan