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

本文关键字:开始 结束 一天 何处理 处理 | 更新日期: 2023-09-27 18:20:01

我正在处理一个客户每天工作30小时的案例。

一天从早上6点开始,然后一直持续到第二天早上6点,但当他们到达第二天凌晨1点时,他们认为这是25点。凌晨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>

那么,有没有办法将DateTime类调整为06:00开始,30:00结束

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

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

然而,这并不意味着你必须调整一天的长度-一天是一项国际公约,除非Jon Skeet真的决定使用他(在一天内;-)建造的巨型重力枪,并用它来改变地球的旋转速度,延长我们所说的光明和黑暗的交替周期,你最好的选择可能是使用轮班或时隙的概念;

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

  • 广告在一个工作日显示的所有小时的总和(Sum[length],其中date=工作日)
  • 将某个时区的广告显示的所有小时相加(Sum[length],其中时区=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)
    }

}

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

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

这使您不仅可以确定"世界时间",还可以知道相对于任何给定客户端的时间

你还没有说明30小时工作日的实际用途,所以如果没有更多信息,我无法提供细节,但正如其他人所说,你需要为你时髦的日期输出提供一个自定义类

由于延长的工作日重叠,您可以使用DateTime实现一些操作,但在介绍这30小时的工作日时,您还需要回答许多问题,并介绍这些工作日的操作和规则的概念。

您几乎肯定需要创建自己的类型来处理此问题。如果没有其他事情,你需要将实际天数(DateTime可以在大多数情况下处理,但如果J.S.发布关于他的高级库/框架的帖子,我不会感到惊讶)转换为"疯狂的日子"。

例如:你真的必须详细说明所有的操作,并回答以下问题:

  • 从2012年1月12日疯狂约会到2012年1日20日疯狂约会之间有多少天
  • 从2012年1月12日到2012年1日20日,有多少疯狂的日子
  • 疯狂的约会从2012年1月12日到1月13日之间有多少小时?还是2012年1月12日和2012年1日14日

所有这些都可能有不同的答案,而且并不明显。您必须与客户一起规范/解决它,这取决于您正在设计的用例、最终用途或流程的输出。

对于这样的场景,我看不出如何"调整"DateTime类。

该类中的所有计算都将有所不同。您可以通过复制/学习DateTime的来源来滚动自己的DateTime。

注意:我会确保我需要这个,这听起来有点错误

如果你保留标准日期,但按照客户的惯例显示它们,也许没关系。

好吧,这不是一天30小时,而是一天24小时,与当地时间相差6小时。听起来你应该使用DateTimeOffset:

DateTime dt = new DateTime(2012, 2, 12, 8, 34, 56); 
var dto = new DateTimeOffset(dt, TimeSpan.FromHours(-6));

您需要使用.Net 3.5才能使用DateTimeOffset结构。请注意,您必须有一个带有DateTimeKind.UnspecifiedDateTime,才能将其输入到具有任何偏移量的DateTimeOffset构造函数中——例如,如果您有DateTimeKind.Utc,则偏移量必须为零。

导入数据时,只需在小时大于24时加1天,然后从小时中减去24。

转换回另一种方式:

public static void DateTimeTo30HourDay(DateTime tx_datetime)
{
    if (tx_datetime.Hour < 6)
    {
        // subtract one day
        tx_datetime = tx_datetime.AddDays(-1);
    }
    int offsetHours = tx_datetime.Hour + 6;
    string tx_date = string.Format("{0}{1}{2}", tx_datetime.Year.ToString().PadLeft(4, '0'), tx_datetime.Month.ToString().PadLeft(2, '0'), tx_datetime.Day.ToString().PadLeft(2, '0'));
    string start_time = string.Format("{0}:{1}", offsetHours.ToString().PadLeft(2, '0'), tx_datetime.Second.ToString().PadLeft(2, '0'));
    // do what you want here
}

这基本上就是你所需要做的。

从DateTime类型的baseDate变量开始。时间到了,将其设置为当前日期baseDate = DateTime.Date.AddHours(6);显示时间时,使用TimeSpan作为:

TimeSpan ts = specifiedDateTime - Globals.baseDate;
string text = string.Format("{0:yyyy.MM.dd} {1:00}:{2:00}", Globals.baseDate, Math.Floor(ts.TotalHours), ts.Minutes);

显示文本变量;