代码之家  ›  专栏  ›  技术社区  ›  J86

计算可配置小时之间的分钟数

  •  2
  • J86  · 技术社区  · 6 年前

    我有一个 Journey 对象具有 DateTime JourneyStartTime { get; set; } 和A DateTime JourneyEndTime { get; set; } . 我想计算晚上10点到早上6点之间的行程总分钟数(请注意,这是在午夜进行的)。

    我试过用时间跨度来表示晚上10点和早上6点,但我不确定这是否是最好的数据类型。

    这个逻辑的域是基于保险的。X公司想给在X-Y小时内驾驶的驾驶员打分。这些时间应该是可配置的。下面是一个场景:

    旅行在同一天下午5点到6点之间进行。公司x inurance对晚上10点到早上6点之间的行程感兴趣。在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 回复  |  直到 6 年前
        1
  •  2
  •   styx    6 年前

    TimeSpan只提供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)
     };
    

    现在你需要做的只是简单的检查-如果旅程时间介于 保险期限设定

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