Это немного похоже на ситуацию, когда у вас есть бизнес, который охватывает несколько часовых поясов - тогда можно иметь непрерывный день, который дольше, чем 24 часа.
Однако это не означает, что вам нужно регулировать продолжительность дня - день является международным соглашением, и, если Джон Скит не решит использовать гигантское гравитационное оружие, которое он, несомненно, построил (через день; -) и использует его для изменения скорости вращения Земли, продлевая чередующийся период света и тьмы, который мы называем днем, лучше всего использовать концепцию сдвига или временного интервала;
Смена (в вашем случае, временной интервал!) Имеет рабочий день, продолжительность и часовой пояс. Вы можете:
- Сумма всех часов, в течение которых было показано объявление за рабочий день (сумма [длина], где дата = рабочий день)
- Сумма всех часов, в течение которых было показано объявление для часового пояса (сумма [длина], где часовой пояс = x группа по рабочему дню
- Суммируйте все часы, в течение которых реклама находилась на определенную астрономическую дату (вычислите количество часов между рабочим днем, временем начала и полуночью и продолжительностью)
Лучше не называть это днями, так как это путает простую терминологию.
В вашем случае вы даже не беспокоитесь о часовом поясе. Я думаю, что все, что вам действительно нужно, это дата / время, когда рекламный таймслот должен начаться, и количество часов, в течение которого оно должно быть показано.
РЕДАКТИРОВАТЬ: В случае вашего XML вы все еще можете использовать вышеупомянутую концепцию. Вы можете либо:
1) Очистите его, когда получите XML, и сохраните его как «правильную» дату-время, поэтому определите время начала UTC и используйте продолжительность
2) Создайте класс, который просто преобразует это в обычное представление даты и времени с длиной. Преимущество этого подхода заключается в том, что вы также можете пойти другим путем, к соглашению об источнике.
Реально, я думаю, что это действительно все, что вам нужно.
Например, в приведенном выше xml вы можете создать класс; что-то вроде этого должно сделать свое дело:
public class AdvertDate{
public DateTime TransmissionDate { get; set;} //Store as 06:00 on the TX_Date
public int AdvertStartTime { get; set; } //Store as 0 - 30
public int Duration { get; set; } //Store as 18 - assuming whole numbers so change if needed
public DateTime RealDate {
get{
return TransmissionDate.AddHours(AdvertStartTime);
}
}
public AdvertDate(){
}
public AdvertDate(DateTime transmissionDate, int advertStartTime, int duration){
TransmissionDate = transmissionDate;
AdvertStartTime = advertStartTime;
Duration = duration;
}
public AdvertDate ConvertRealDateTimeToAdvertDate(DateTime realDateTime, int advertDuration){
if(realDateTime.Hour < 6)
{
DateTime advertDateTime = realDateTime.AddDays(-1).Date.AddHours(6);
return new AdvertDate(advertDateTime, 24+realDateTime.Hour, advertDuration);
}
else{
return new AdvertDate(realDateTime.Date.AddHours(6), realDateTime.Hour, advertDuration);
}
}
public void LoadFromXml(){
//Xml Loading here (or in a dedicated class or wherever)
}
}