如何处理从06:00开始到30:00结束的一天

Wil*_*lem 23 .net c# datetime c#-4.0

我正在处理客户每天30小时的情况.

这一天从早上6点开始,然后在第二天上午6点左右开始,但是当他们第二天凌晨1点到达时,他们将其视为25:00.凌晨2点将是26:00等等......

现在,我想知道,有没有办法解决这个问题,c#'s DateTime class或者我是否需要做很长的事情并将其全部拆分?

更新:

它是澳大利亚的媒体代理商.再来一次解释,这一天从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>
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法调整DateTime课程从06:00开始到30:00结束?

das*_*ash 20

这听起来有点像你有一个覆盖多个时区的业务的情况 - 那么,有可能连续一天超过24小时.

然而,这并不意味着你必须调整一天的长度 - 一天是一个国际惯例,除非Jon Skeet实际上决定使用他已经无法建造的巨型重力枪(一天;-)和用它来改变地球的旋转速度,延长我们称之为一天的光明和黑暗的交替周期,你最好的选择是使用移位或时间段的概念;

一个班次(在你的情况下,一个时间段!)有一个工作日,一个长度和一个时区.然后你可以:

  • 汇总广告在工作日显示的所有小时数(总和[长度],其中日期=工作日)
  • 将时区显示的广告的所有小时数相加(sum [length]其中timezone = x group by workday
  • 汇总广告在特定天文日期的所有小时数(计算工作日之间的小时数.启动时间与午夜时间与长度之间的小时数)

最好不要把它们称为日子,因为它会混淆直截了当的术语.

在你的例子中,你甚至不关心时区.我认为您真正需要的是广告时段即将开始的日期/时间,以及它应显示的小时数.

编辑:对于您的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)
    }



}
Run Code Online (Sandbox Code Playgroud)


Gon*_*ing 7

始终以一些通用标准格式存储数据,并将任何其他要求仅视为显示/输出格式.

处理源自不同时区(与服务器不同或客户端之间)的日期/时间时,最好使用C#DateTimeOffset结构以及SQL Server 2008 R2 的datetimeoffset字段类型存储它们.

这使您不仅可以确定"通用时间",还可以了解相对于任何给定客户的时间.

您尚未说明30小时工作日的实际用途,因此我无法在没有更多信息的情况下提供详细信息,但正如其他人所说,您需要为您的时髦日期输出提供自定义类.

  • 回到我的第一点...*始终以一些通用的标准格式存储您的数据*...在加载XML时转换为DateTimeOffsets ...如果需要,转换回显示.*还记得失败的火星任务,因为它使用了每小时英里而不是SI单位吗?*:) (2认同)