我正在处理客户每天工作30小时的情况。

一天从凌晨6点开始,然后在第二天凌晨6点左右开始,但是当他们第二天凌晨1点到达时,则将其视为25:00。凌晨2点将是26:00小时,依此类推...

现在,我想知道,是否有办法在c#'s DateTime class中处理此问题,或者我需要做很长的一段路程并将其全部拆分吗?

UPDATE :

这是澳大利亚的一家媒体代理商。再次说明一下,这一天从06:00 am (12 Jan 2012)开始,到午夜24:00。现在,第二天为01:00 am (13 Jan 2012)时,客户端将其作为25:00 hours (12 Jan 2012)

他们仍然每天有24小时。唯一的区别是,他们的一天从早上6点开始,而不是像我们这样的00小时。

更新:

我需要使用的典型程序的XML表示形式。
注意:已删除CHANNEL_CODE和CHANNEL_NAME。

 <PROGRAMME>
  <PROGRAMME_ID>1</PROGRAMME_ID>
  <PROGRAMME_NAME>Mass For You At Home</PROGRAMME_NAME>
  <CHANNEL_CODE>SomeCode</CHANNEL_CODE>
  <CHANNEL_NAME>SomeChannel</CHANNEL_NAME>
  <TX_DATE>20120101</TX_DATE>
  <START_TIME>06:00</START_TIME>
  <DURATION>1800</DURATION>
  <AGENCY_AVAIL>C</AGENCY_AVAIL>
  <SALES_AVAIL>90</SALES_AVAIL>
  <SSB>N</SSB>
 </PROGRAMME>
</PROGRAMME>


<PROGRAMME>
  <PROGRAMME_ID>2</PROGRAMME_ID>
  <PROGRAMME_NAME>Home Shopping</PROGRAMME_NAME>
  <CHANNEL_CODE>SomeCode</CHANNEL_CODE>
  <CHANNEL_NAME>SomeChannel</CHANNEL_NAME>
  <TX_DATE>20120101</TX_DATE>
  <START_TIME>26:00</START_TIME>
  <DURATION>1800</DURATION>
  <AGENCY_AVAIL>C</AGENCY_AVAIL>
  <SALES_AVAIL>0</SALES_AVAIL>
  <SSB>N</SSB>
 </PROGRAMME>

因此,也许可以将DateTime类调整为从06:00开始到30:00结束吗?

最佳答案

这听起来有点像您的业务涉及多个时区的情况-那么,连续一天的营业时间可能会超过24小时。

但是,这并不意味着您必须调整一天的时间-一天是国际惯例,并且,除非乔恩·斯凯特(Jon Skeet)真正决定使用他无疑制造的巨型重力枪(一天之内;-)和使用它来改变地球的旋转速度,延长我们称为一天的明暗交替的时间,您最好的选择是使用移位或时隙的概念;

轮类(在您的情况下,就是一个时隙!)有一个工作日,一个时长和一个时区。然后,您可以:

  • 汇总一个工作日的所有广告展示时间(sum [length],其中date =工作日)
  • 总计显示一个时区的所有广告时间(sum [length],其中timezone = 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)
        }
    
    
    
    }
    

    08-26 18:26
    查看更多