Подтвердить что ты не робот

Как обрабатывать день, который начинается с 06:00 и заканчивается в 30:00

Я работаю с случаем, когда у клиента есть 30-часовой день.

День начинается в 6 часов утра, а затем идет на следующий день до 6 утра, но когда они прибудут в 1 утра на следующий день, они заберут это как 25:00 часов. 2 часа ночи будет 26:00 часов и т.д....

Теперь, я хочу знать, есть ли способ справиться с этим в c# 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 часов, как мы.

UPDATE:

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?

4b9b3361

Ответ 1

Это немного похоже на ситуацию, когда у вас есть бизнес, который охватывает несколько часовых поясов - возможно, для этого есть непрерывный день, который длится более 24 часов.

Однако это не означает, что вам нужно отрегулировать длину дня - день - это международная конвенция, и, если только Джон Скит не решит использовать гигантский гравитационный пистолет, который он, без сомнения, построил (через день; -) и использует его для изменения скорости вращения Земли, расширяя чередующийся период света и тьмы, который мы называем днем, лучше всего использовать концепцию сдвига или временного интервала;

Смена (в вашем случае, временной интервал!) имеет рабочий день, длину и часовой пояс. Затем вы можете:

  • Суммируйте все часы, в которые показывалось объявление за рабочий день (сумма [длина], где дата = рабочий день)
  • Суммируйте все часы показа объявлений для часового пояса (сумма [длина], где timezone = x group by workday
  • Суммируйте все часы, в которые рекламировалась определенная астрономическая дата (выработайте количество часов между рабочим днем ​​и стартом в полночь по сравнению с длиной)

Лучше не ссылаться на них как на дни, поскольку это путает прямую терминологию.

В вашем случае вы даже не беспокоитесь о часовом поясе. Я думаю, что все, что вам действительно нужно, это дата/время, когда должен начинаться рекламный слот, и количество часов, которое должно быть показано для.

EDIT: в случае вашего XML вы все равно можете использовать приведенную выше концепцию. Вы можете:

1) Очистите его, когда вы получите XML и сохраните его как "правильное" дата-время, поэтому определите, что такое время начала UTC, и используйте продолжительность

2) Создайте класс, который просто преобразует это в нормальное представление datetime с длиной. Преимущество этого подхода состоит в том, что вы также можете перейти в исходное соглашение.

Реально, я думаю, что действительно все, что вам нужно.

Например, в 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)
    }



}

Ответ 2

Всегда сохраняйте свои данные в каком-то универсальном стандартном формате и обрабатывайте любые другие требования только в формате отображения/вывода.

При работе с датой/временем, происходящей из разных часовых поясов (отличных от сервера или между клиентами), лучше хранить их с помощью С# DateTimeOffset структуры вместе с datetimeoffset полевым типом SQL Server 2008 R2.

Это дает вам возможность определять не просто "универсальное время", но также знать, что такое время относительно любого данного клиента.

Вы не указали фактическое использование в течение 30-часовых дней, поэтому я не могу предоставить конкретные подробности без дополнительной информации, но, как заявлено другими, вам необходимо предоставить собственный класс для вашего фанк-вывода.

Ответ 3

Поскольку расширенные дни перекрываются, некоторые операции, которые вы могли бы достичь с помощью DateTime, но в то время, когда вы вводите этот 30-часовой день, вам также необходимо ответить на множество вопросов и ввести понятия операций и правил тех дней.

Вам почти наверняка понадобится создать свой собственный тип для обработки этого. Если ничего больше, вам нужно будет конвертировать фактические дни (DateTime может обрабатывать в большинстве случаев, хотя я не удивлюсь, если JS размещает информацию о его превосходной библиотеке/фреймворке) в/из "сумасшедших дней".

Например: вам действительно нужно указать все операции и ответить на следующие вопросы:

  • Сколько дней между сумасшедшими 12 января 2012 года и сумасшедшими 20 января 2012 года?
  • Сколько сумасшедших дней между нормальной датой 12 января 2012 года и нормальной датой 20 января 2012 года?
  • Сколько часов между сумасшедшими датами 12 января 2012 года и 13 января 2012 года? Или 12 января 2012 года и 14 января 2012 года?

Все они могут иметь разные ответы и не очевидны. Вам нужно будет специфицировать/обработать его с клиентом, в зависимости от того, какой вариант использования или конечного использования, или вывода процесса (процессов), который вы разрабатываете.

Ответ 4

Я не вижу возможности "корректировать" класс DateTime для такого сценария.

Все вычисления в классе будут разными. Вы можете свернуть свой собственный DateTime, скопировав/узнав из источников DateTime.

NB: я бы очень убедился, что мне это понадобится, это звучит немного неправильно

Ответ 5

Возможно, это будет нормально, если вы сохраните стандартные даты, но покажете их с соглашением своего клиента.

Ответ 6

Хорошо, так что это не тридцатьчасовой день, а 24-часовой день с вашего локального времени на шесть часов. Похоже, вы должны использовать DateTimeOffset:

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

Вам нужно использовать .Net 3.5, чтобы иметь возможность использовать структуру DateTimeOffset. Обратите внимание, что вам нужно иметь DateTime с DateTimeKind.Unspecified, чтобы иметь возможность передавать его в конструктор DateTimeOffset с любым смещением - например, если у вас есть DateTimeKind.Utc, то ваше смещение должно быть нулевым.

Ответ 7

При импорте данных просто добавьте 1 день, когда час больше 24, а затем вычитает 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
}

Это в основном все, что вам нужно сделать.

Ответ 8

Начните с переменной baseDate, заданной в DateTime. Когда это время для него, установите его на текущую дату 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);

Отобразить текстовую переменную;