Member 13261884 Ответов: 1

Каков был бы наиболее точный способ расчета времени в этом случае?


Привет!
Я работаю над системой отслеживания времени, которую хочу использовать в приложении MVC 5.
Вот что у меня есть до сих пор:

Мой (упрощенный) класс ClockInOut. cs
public Guid Id { get; set; }
public DateTime ClockIn { get; set; }
public DateTime ClockOut { get; set; }
public TimeSpan Duration { get; set; }

Теперь, на мой взгляд, у пользователя есть две кнопки. Часы приходят и уходят.

Это действия контроллера:
public ActionResult ClockIn()
{
    var model = new ZeitBuchungDto()
                {
                    Id = Guid.NewGuid(),
                    Kommen = DateTime.Now,
                    Gehen = new DateTime(9998,12,31,0,0,0),
                };
    
    var convertToEntity = Mapper.Map<ZeitBuchungDto, ZeitBuchung>(model);
    
    zeitContext.ZeitBuchung.Add(convertToEntity);
    zeitContext.SaveChanges();

    return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}

public ActionResult ClockOut()
{
    using (var db = new ZeitContext())
          {
              db.ZeitBuchung.Attach(convertToEntity);
              convertToEntity.Gehen = DateTime.Now;
              convertToEntity.AktuellGebucht = false;
              convertToEntity.Gesamtdauer = convertToEntity.Gehen - zeitKommen;
              db.Entry(convertToEntity).Property(x => x.Gesamtdauer).IsModified = true;
              db.Entry(convertToEntity).Property(x => x.Gehen).IsModified = true;
              db.SaveChanges();
           }
    return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}

Теперь то, что будет дальше, - это то, что меня не устраивает:
private IEnumerable<TimeSpan> GetTotalTime()
{
    var totalTime = myContext.MyEntity.Select(m => m.Duration).AsEnumerable();

    return totalTime;
}

public ActionResult Index()
{
    IEnumerable<TimeSpan> time = GetTotalTime();
    var totalTime = time.Sum(s => s.Ticks);
    var convertedTime = TimeSpan.FromTicks(totalTime).ToString(@"hh\:mm");

    ViewBag.Hours = convertedTime;

    return View(model);
}


Что я уже пробовал:

На самом деле все это работает, но у меня такое чувство, что это преобразование довольно неточно.

Во время моих тестов я заметил, что иногда цифры, которые я вижу, не складываются. Возможно, это просто проблема округления, но я все еще довольно новичок в программировании, поэтому не могу судить об этом.

То, что я хотел бы иметь, - это точное представление. Взгляните на эту картинку:
http://fs5.directupload.net/images/170905/zhvrlb4j.png
Там, где я поставил круг, я предполагаю, что он только что округлился до 1 минуты - что сейчас не так уж плохо. Но представьте себе, что у вас есть целый месяц данных, и он просто округляется до хорошего количества минут - человек, проверяющий время в конце месяца, может запутаться.

Так что моя причина для того, чтобы спросить - помилуй мой код, он, вероятно, не очень хорош, лол, - но в любом случае, как бы я получил точную иллюстрацию различных времен.

Надеюсь, у вас есть какие-то предложения....

Заранее спасибо :)

Пол

1 Ответов

Рейтинг:
1

Dave Kreskowiak

Временной интервал в EF сопоставляется с полем времени в SQL Server. Это поле времени может содержать только значения до 24 часов, где в качестве временного интервала может выходить за его пределы.

Округление, которое вы видите, находится только в пользовательском интерфейсе, а не в свойстве TimeSpan или поле Time в базе данных.

Округление, которое вы видите, не будет накапливаться, потому что его на самом деле нет. Математика для сложения всех временных интервалов будет работать с неокругленными значениями, А не с округленным отображаемым значением.