我必须在网站上花费时间,所以我选择在数据库中维护2个日期时间和时间,以便我可以保存登录时间和注销时间之间的差异,并将其作为列timespent
存储在表中。
时间将存储为{00:16:58.413785200}
所以我在每次注销后递归添加一些时间,这样如果他在第一次登录时花费10分钟,在第2次登录时花费5分钟,我们必须存储15分钟在网站上的timspent。
但问题是如果我想在23:59:59.000000000之后加2分钟,我无法猜测会发生什么。我知道最大时间值是23:59:59,可以在sql中存储为time数据类型。
那么如何实现呢?我试过这样的
var _user = db.Users.SingleOrDefault(t => t.Id == id);
_user.EndTime = DateTime.Now;
var _startTime = _user.StartTime;
if (_user.TimeSpent != null)
{
_user.TimeSpent = _user.TimeSpent + (_user.EndTime - _startTime);
}
else
{
_user.TimeSpent = (_user.EndTime - _startTime);
}
db.SaveChanges();
答案 0 :(得分:1)
您需要将TimeSpent
列上的数据类型切换为bigint
。 TimeSpent
列的默认值为0,或者在代码中处理它。
var _user = db.Users.SingleOrDefault(t => t.Id == id);
_user.EndTime = DateTime.Now;
var _startTime = _user.StartTime;
TimeSpan timeSpent = _user.TimeSpent != null ? TimeSpan.FromTicks(_user.TimeSpent) : 0;
if (timeSpent > TimeSpan.Zero)
{
timeSpent = timeSpent + (_user.EndTime - _startTime)
}
else
{
timeSpent = _user.EndTime - _startTime
}
_user.TimeSpent = timeSpent.Ticks;
db.SaveChanges();
答案 1 :(得分:1)
你可以做一个简单的检查,看看结束时间<开始时间。如果是,则假设开始时间是前一天。这样的事情应该有效:
// _user.StartTime
TimeSpan startTime = TimeSpan.Parse("23:59:54");
// DateTime.Now
DateTime now = new DateTime(2014, 04, 11, 00, 05, 00);
// Get the time portion of DateTime.Now
TimeSpan endTime = now - now.Date;
TimeSpan timeSpent = TimeSpan.Zero;
if (endTime > startTime)
timeSpent = endTime - startTime;
else
timeSpent = endTime - startTime + TimeSpan.FromHours(24);
Console.WriteLine(timeSpent);
答案 2 :(得分:0)
最好的方法是存储DateTime值而不仅仅是Time值。这样你就不会有这样的限制。即使您找到了24小时问题的解决方法,如果用户花费超过一天的时间(根据时差),您会怎么做?所以更好的前进方式 -
但当然不仅仅是时间。您需要为此更改表格架构以及相当多的代码: - )