Мозговой штурм: как расположить DateTime для определенного интервала кадра? - PullRequest
1 голос
/ 27 декабря 2010

Предположим, у меня есть DateTime, e. г. 2010.12.27 12:33:58 и у меня есть интервал кадров, предположим, 2 секунды, исключая последнюю границу.

Итак, у меня есть следующие кадры:

12: 33: 58 (вкл.) - 12:34:00 (не вкл.) - пусть это будет интервал 1

12: 34: 00 (вкл.) - 12:34:02 (не вкл.) - пусть это будет интервал 2

12: 34: 02 (вкл.) - 12:34:04 (не вкл.) - пусть это будет интервал 3

и т. Д.

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

E. г. значение «12:33:58» попадает в интервал 1, «12:33:59» попадает в интервал 1, «12:34:00» попадает в интервал 2 и т. д.

В коде это должно выглядеть следующим образом:

var dt = DateTime.Now;
DateTime intervalStart = apply_the_algorythm(dt);

Кажется, что это какое-то простое арифметическое действие (я) с плавающей точкой или чем-то еще, любые решения приветствуются!

Ответы [ 5 ]

2 голосов
/ 27 декабря 2010

Если вы хотите, чтобы диапазон всех ваших интервалов составлял несколько дней, возможно, долгое время, вы можете выразить свои DateTime значения в UNIX-секундах (количество секунд с 1970-01-01).Затем вы просто узнаете, когда начался ваш самый первый интервал, подсчитаете, сколько секунд прошло с тех пор, и поделите на два:

int secondsSinceFirstInterval = <currDate in UNIX time>
                                 - <start of first interval in UNIX time>;
int intervalIndex = secondsSinceFirstInterval / 2;

В противном случае вам лучше просто считать с полуночи.

2 голосов
/ 27 декабря 2010

Если интервал является только вторым разрешением и всегда делится на 86400, то возьмите число прошедших сегодня секунд, разделите его на интервал, округлите до целочисленного значения, умножьте и добавьте к сегодняшнему дню.Что-то вроде dateinquestion.Subtract (dateinquestion.Date) .TotalSeconds, ((int) секунд / интервал) * интервал, dateinquestion.Date.AddSeconds (...)

1 голос
/ 27 декабря 2010

Используйте TimeSpan.TotalSeconds и разделите результат на размер интервала.

const long intervalSize = 2;
DateTime start = new DateTime(2010, 12, 27, 12, 33, 58);

TimeSpan timeSpan = DateTime.Now - start;
long intervalInSeconds = (long)timeSpan.TotalSeconds;
long intervalNumber = 1 + intervalInSeconds / intervalSize;
0 голосов
/ 27 декабря 2010
dates = new List<DateTime>
            {
                DateTime.Now.AddHours(-1),
                DateTime.Now.AddHours(-2),
                DateTime.Now.AddHours(-3)
            };
            dates.Sort((x, y) => DateTime.Compare(x.Date, y.Date)); 
            DateTime dateToCheck = DateTime.Now.AddMinutes(-120);
            int place = apply_the_algorythm(dateToCheck);
            Console.WriteLine(dateToCheck.ToString() + " is in interval :" +(place+1).ToString());

private int apply_the_algorythm(DateTime date)
        {
            if (dates.Count == 0)
                return -1;
            for (int i = 0; i < dates.Count; i++)
            {
                // check if the given date does not fall into any range.
                if (date < dates[0] || date > dates[dates.Count - 1])
                {
                    return -1;
                }
                else
                {
                    if (date >= dates[i]
                        && date < dates[i + 1])
                        return i;
                }
            }
            return dates.Count-1;
        }
0 голосов
/ 27 декабря 2010
 DateTime start = new DateTime(2010, 12, 31, 12, 0, 0);
 TimeSpan frameLength = new TimeSpan(0, 0, 3);
 DateTime testTime = new DateTime(2010, 12, 31, 12, 0, 4);

 int frameIndex = 0;
 while (testTime >= start)
 {
     frameIndex++;
     start = start.Add(frameLength);
 }

 Console.WriteLine(frameIndex);
...