2013-04-23 77 views
1

我有一個CSV文件,我導入到VehicleMovement表。每個記錄都是車輛出口或停車場入口,並且在着火時跳過鐵環後,我已將這些記錄合併到一個VehiclePresence表中,其中幾乎每個記錄都具有StartDateTimeEndDateTime。現在我必須計算車輛出現時的停車費用。當存在超過一天時,這是一個問題。停車價格基於一天中的時間,一週中的一天等,因此我需要將這種存在分爲單日存在並計算每日存在的費用。如何將兩個日期時間之間的天數分成幾天?

E.g.我的轉換時間爲06h00,並且有VehiclePresence記錄,其中StartDateTime == 2013-04-22 20:37:28EndDateTime == 2013-04-25 22:55:20。我想變出以下VehiclePresenses

1. 04/22 20h37 to 04/23 06h00. 
2. 04/23 06h00 to 04/24 06h00. 
3. 04/24 06h00 to 04/25 22h55. 

這將讓我有一個原來VehiclePresence紀錄修改開始和結束時間,以及兩個新的記錄,我會插入。這沒有問題。

我該怎麼做?我個人只需在24小時內收取一筆鉅額費用,但我簡要介紹了各種定價規則。

+0

那麼,你嘗試過這麼遠嗎?在我看來,你需要的第一件事就是用來表示一個from/to對的類型......而且我懷疑用迭代器塊會很容易實現這一點。您可能還想看看我的[Noda Time](http://noda-time.googlecode.com)庫,以獲得比BCL提供的更令人愉快的日期/時間類型。 – 2013-04-23 17:13:36

+0

@JonSkeet我沒有嘗試太多,這個項目一直是一個大腦的緊張,我應該在早上解決這個問題。儘管我現在想嘗試。我到目前爲止添加了我的代碼,並會考慮Noda,謝謝。 – ProfK 2013-04-23 17:17:58

+0

我假設你的意思是你會在例子中得到四個時間跨度?否則,最後一個將超過24小時。 – Guffa 2013-04-23 17:22:14

回答

1

計算開始時間後的第一個休息時間,並循環一天一天,直到達到結束時間。

例子:

DateTime StartDateTime = new DateTime(2013, 04, 22, 20, 37, 28); 
DateTime EndDateTime = new DateTime(2013, 04, 25, 22, 55, 20); 

DateTime startTime = StartDateTime; 

// calculate first break time 
DateTime breakTime = StartDateTime.Date.AddHours(6); 
if (breakTime < StartDateTime) { 
    breakTime = breakTime.AddDays(1); 
} 

while (breakTime < EndDateTime) { 

    Console.WriteLine("{0} - {1}", startTime, breakTime); 

    // move to next day 
    startTime = breakTime; 
    breakTime = breakTime.AddDays(1); 

} 
Console.WriteLine("{0} - {1}", startTime, EndDateTime); 

輸出:

2013-04-22 20:37:28 - 2013-04-23 06:00:00 
2013-04-23 06:00:00 - 2013-04-24 06:00:00 
2013-04-24 06:00:00 - 2013-04-25 06:00:00 
2013-04-25 06:00:00 - 2013-04-25 22:55:20 
+0

這和我在一段時間後最終想到的非常相似。用正確的四個項目,而不是三個。謝謝。 – ProfK 2013-04-24 09:07:10