2011-07-25 105 views
1

我在C#中做了一个小的停车应用程序。根据车辆类型和时区有一些不同的价格。日可以分为时区(例如早晨,白天,傍晚和夜晚)。现在,如果客户停止停车,我想计算客户在哪个时区停车以及停车多久。查找时间在一定的时间范围内的发生次数和持续时间

例如早上的时区从6:00开始到12:00结束,日时区从12:00开始到16:00结束,晚上时区从16:00开始到23:00和晚上结束时区在23:00开始,在6:00结束。客户于00:30开始停车,并在6:32停止停车。目前我有4个变量:停车开始时间,停车结束时间和时区开始时间和时区结束时间。

第二个例子就像客户公园24小时一样,那么停车时间就包含了所有时区。

如何计算客户在不同时区将车停放多少小时和分钟的最简单方法?

问候, evilone

编辑:

得到了MSDN这个答案,并张贴在这里,以便其他人可以从中学习了。

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      DateTime start = new DateTime(2011, 7, 25, 0, 30, 0); 
      DateTime end = new DateTime(2011, 7, 26, 6, 32, 0); 
      List<DateTime> listTimeZones = CalculateTotalTime(start, end); 

      StringBuilder sb = new StringBuilder(); 
      for (int i = 0; i < listTimeZones.Count; i++) 
      { 
       sb.AppendLine(String.Format("{0}. {1}: from {2} to {3}", 
              i + 1, 
              GetZoneInWords(listTimeZones[i].Hour), 
              String.Format("{0:dd.MM.yyyy hh:mm}", listTimeZones[i]), 
              (i + 1) < listTimeZones.Count 
               ? String.Format("{0:dd.MM.yyyy hh:mm}", listTimeZones[i + 1]) 
               : "Parking ended")); 
      } 
      MessageBox.Show(sb.ToString()); 
     } 

     private List<DateTime> CalculateTotalTime(DateTime start, DateTime end) 
     { 
      DateTime temp = start; 

      int hour = start.Hour; 
      int minute = start.Minute; 

      int morning = 6; 
      int day = 12; 
      int evening = 17; 
      int night = 23; 

      List<DateTime> timeZones = new List<DateTime>(); 

      do 
      { 
       temp = temp.AddHours(1); 
       if (temp.Hour == morning || temp.Hour == day || 
        temp.Hour == evening || temp.Hour == night) 
       { 
        timeZones.Add(temp); 
       } 
      } while (temp < end); 

      return timeZones; 
     } 

     private string GetZoneInWords(int time) 
     { 
      string timeOfDay = ""; 
      if (time.Equals(6)) 
       timeOfDay = "Morning"; 
      else if (time.Equals(12)) 
       timeOfDay = "Day"; 
      else if (time.Equals(17)) 
       timeOfDay = "Evening"; 
      else if (time.Equals(23)) 
       timeOfDay = "Night"; 

      return timeOfDay + " parking"; 
     } 
    } 

回答

4

迭代通过所有的“时区”并为每个,制定出与客户的停车位之间的重叠。例如,作为伪代码:

private static TimeSpan FindOverlap(ParkingTime parkingTime, TimeZone timeZone) 
{ 
    // Handle wraparound zones like 23-6. Note that this doesn't attempt 
    // to handle *parking* which starts at 11.30pm etc. 
    if (timeZone.Start > timeZone.End) 
    { 
     return FindOverlap(parkingTime, 
        new TimeZone(timeZone.Start.Date, timeZone.End) 
      + FindOverlap(parkingTime, 
        new TimeZone(timeZone.End, timeZone.Start.Date.AddDays(1)); 
    } 

    DateTime overlapStart = Max(parkingTime.Start, timeZone.Start); 
    DateTime overlapEnd = Min(parkingTime.End, timeZone.End); 
    TimeSpan overlap = overlapEnd - overlapStart; 

    // If the customer arrived after the end or left before the start, 
    // the overlap will be negative at this point. 
    return overlap < TimeSpan.Zero ? TimeSpan.Zero : overlap; 
} 

private static DateTime Min(DateTime x, DateTime y) 
{ 
    return x < y ? x : y; 
} 

private static DateTime Max(DateTime x, DateTime y) 
{ 
    return x > y ? x : y; 
} 

顺便说一句,我会强烈鼓励你重命名你的“时区”的概念,因为它已经有一个众所周知的(如果没有得到很好理解:)的意思。

也许你应该叫它ParkingInterval?或者ParkingPriceInterval如果差别真的在成本方面?

+0

C#确实没有针对IComparable对象的最小/最大内置方法吗? – jdmichal

+0

@jdmichal:嗯,C#是一种语言 - 它会是.NET,它有这些方法。它们可能以某种通用形式存在,但我不知道它们。当然你可以使用LINQ方法。 –

+0

@Jon Skeet谢谢你...... – evilone

相关问题