Рассчитать количество минут между настраиваемыми часами - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть Journey объект, который имеет DateTime JourneyStartTime { get; set; } и DateTime JourneyEndTime { get; set; }.Я хочу подсчитать общее количество минут, которые поездка потратила между 22:00 и 6:00 (обратите внимание, это продолжается более полуночи).

Я пытался использовать TimeSpans для индикации 10:00 и 6:00, но я не уверен, что этоявляется лучшим типом данных для использования.

Домен для этой логики основан на страховании.Компания X хочет набрать очки водителям, которые ездят между X - Y часами.Эти часы должны быть настраиваемыми.Вот сценарий:

Путешествие происходит в тот же день с 17:00 до 18:00.Компания X Inurance заинтересована в поездках с 22:00 до 6:00.Сколько минут эта поездка потратила за период, который интересует Компания X?

Ответ на этот вопрос: 0, но мой код дает 60 минут (здесь dotnetFiddle ).

Вот код.

КОД

using System;

public class Program
{
    public static void Main()
    {
        var shortSameDayJourney = new Journey {
            JourneyId = 1,
            // start of journey - 5pm - start
            JourneyStartTime = new DateTime(2018, 12, 17, 17, 00, 00, DateTimeKind.Utc),
            // end of journey - 6pm - end
            JourneyEndTime = new DateTime(2018, 12, 17, 18, 00, 00, DateTimeKind.Utc)
        };

        var scoreTimePeriod = new InsurerTimePeriodScoreSetting {
            // start of insurer's time period.
            StartOfTimePeriod = DateTime.Now + TimeSpan.FromHours(22),
            // end of insurer's time period.
            EndOfTimePeriod = DateTime.Now + TimeSpan.FromHours(30)     
        };

        var minutesInTimePeriod = getNumberOfMinutesThatJourneyWasInTimePeriod(shortSameDayJourney, scoreTimePeriod);
        Console.WriteLine("Number of minutes the journey was within the time period the insurer had sepcified:");       
        Console.WriteLine(minutesInTimePeriod + " minutes");
    }

    public static double getNumberOfMinutesThatJourneyWasInTimePeriod(
        Journey journey,
        InsurerTimePeriodScoreSetting insurerTimePeriod) {

        var JourneyStart = journey.JourneyStartTime;
        var JourneyEnd = journey.JourneyEndTime;

        var timeSpan = insurerTimePeriod.EndOfTimePeriod - insurerTimePeriod.StartOfTimePeriod;
        var startDif = (JourneyStart - insurerTimePeriod.StartOfTimePeriod);
        var endDif =  (insurerTimePeriod.EndOfTimePeriod - JourneyEnd);

        var time = timeSpan - startDif - endDif;

        return time.TotalMinutes;
    }
}

public class Journey {
    public int JourneyId {get;set;}
    // journey start date and time in UTC, comes form a tracking device on vehicle.
    public DateTime JourneyStartTime {get;set;}
    // journey end date and time in UTC, comes form a tracking device on vehicle.
    public DateTime JourneyEndTime {get;set;}
}

public class InsurerTimePeriodScoreSetting {
    public DateTime StartOfTimePeriod {get;set;}
    public DateTime EndOfTimePeriod {get;set;}
}

1 Ответ

0 голосов
/ 18 декабря 2018

Временной интервал дает только ваше сырое время между 2 DateTime's, поэтому мне пришлось изменить инициализацию Journey, чтобы я мог сравнивать в тот же день

   var shortSameDayJourney = new Journey
   {
       JourneyId = 1,
       // start of journey - 5pm - start
       JourneyStartTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 17, 00, 00, DateTimeKind.Utc),
       // end of journey - 6pm - end
       JourneyEndTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 18, 00, 00, DateTimeKind.Utc)
    };  

то же самое для InsurerTimePeriodScoreSetting

 var scoreTimePeriod = new InsurerTimePeriodScoreSetting
 {
     // start of insurer's time period. 18/12 22:00
      StartOfTimePeriod = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 22, 0, 0, DateTimeKind.Utc),   // DateTime.Now + TimeSpan.FromHours(22),
     // end of insurer's time period. 19/12 6:00
     EndOfTimePeriod = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day + 1, 6, 0, 0, DateTimeKind.Utc)  // DateTime.Now + TimeSpan.FromHours(30)
 };

Теперь все, что вам нужно сделать, это простая проверка - если время в пути составляет InsurerTimePeriodScoreSetting

if (JourneyStart >= insurerTimePeriod.StartOfTimePeriod && JourneyEnd <= insurerTimePeriod.EndOfTimePeriod)
{
// your same calculation here
}
else
   return 0;
...