Рекурсивно сохранять разницу между двумя датами и вычислять время, проведенное на веб-сайте

#c# #sql #date #datetime

#c# #sql #Дата #дата и время

Вопрос:

Мне нужно найти время, проведенное на сайте, поэтому я выбираю поддерживать 2 даты и время в базе данных, чтобы я мог сохранить разницу между временем входа в систему и временем выхода из системы и сохранить ее в таблице в виде столбца timespent .

Время будет сохранено, {00:16:58.413785200} поэтому я рекурсивно добавляю некоторое количество времени после каждого выхода из системы, так что, если он потратил 10 минут при первом входе в систему и 5 минут при втором входе, мы должны сохранить 15 минут для времени, потраченного на сайте.

Но проблема в том, что я не могу угадать, что произойдет, если я захочу добавить 2 минуты после 23:59:59.000000000. Я знаю, что максимальное значение времени равно 23:59:59, которое может быть сохранено для типа данных time в sql.

Итак, как этого добиться? Я пробовал так

  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();
 

Комментарии:

1. Обычно я сохранял галочки (long для .net и bigint для sqlserver), а затем использовал это значение. Тогда временной интервал не будет ограничен только 23:59:59.

2. не могли бы вы предложить какой-нибудь код в соответствии с моим требованием

Ответ №1:

Вам нужно будет переключить тип данных в TimeSpent столбце на bigint . У вас также должно быть значение по умолчанию 0 для TimeSpent столбца или обрабатывать его в вашем коде.

 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();
 

Ответ №2:

Вы можете выполнить простую проверку, чтобы увидеть, является ли время окончания <временем начала. Если это так, то предположим, что время начала было в предыдущий день. Что-то вроде этого должно работать:

 // _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);
 

Ответ №3:

Лучшим способом было бы сохранить значение даты и времени вместо просто значения времени. Таким образом, у вас не будет таких ограничений. Даже если вы нашли обходной путь для 24-часовой проблемы, что бы вы сделали, если возникнет ситуация, когда пользователь потратил более одного дня (в зависимости от разницы во времени)? Итак, лучшие пути вперед —

  1. Дата и время
  2. Длинное значение — в тактах, количестве секунд и т. Д

Но, конечно, не только время. Для этого вам нужно будет изменить схему таблицы и немного кода 🙂

Комментарии:

1. Даты и время должны храниться в UTC, если они используются в контексте, где применяются несколько часовых поясов. Затем вы должны применить правильный часовой пояс для каждого пользователя при представлении.