Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Упаковывание даты с double(8 байт)


Автор: Brodyaga 28.11.2008, 16:44
Всем доброго времени суток! Мне нужно как то представить дату в виде числа типа double, тоесть зная целочисленные значения года, месяца, дня, часа, минут и секунд используя какой-либо алгоритм упаковать их в одно число double... Какие предложения?

Автор: Hades 28.11.2008, 19:58
а год в каком формате, 2 или 4 цифры?

Алгоритм
Код

максимальные значения:
месяцы  - 12   m1
дни     - 31   m2
часы    - 23   m3
минуты  - 59   m4
секунды - 59   m5
годы    - 99   m6    (2 цифры)


        j<i
ki = sum(mj*kj) + 1;
        j=1
 
i = 1, 2, 3, 4, 5, 6;

k1 = 1;
k2 = 13;
k3 = 416;
k4 = 9984;
k5 = 599040;
k6 = 35942400;

число = ((((m1*к1 + m2*к2) + m3*к3) + m4*к4) + m5*к5) + m6*к6;
m6 =  число / k6;
m5 = число%k6/k5;
m4 = число%k6%k5/k4;
...

Только я не уверен, будет ли нормально работать с double.

Код

int main() {
    unsigned long arhiv = 0;
    int data[6] = {12,  // месяцы
                    1,  // дни
                   23,  // часы
                   50,  // минуты
                   59,  // секунды
                   98}; // годы
    long coef[6] = {1, 13, 416, 9984, 599040, 35942400};

    for(int i = 0 ; i < 6; ++i)
        arhiv += data[i]*coef[i];

    cout << arhiv << endl << endl;

    for(i = 5; i >= 0; --i) {
        cout << (arhiv/coef[i]) << endl;
        arhiv %= coef[i];
    }

    return 0;
}

Автор: maxim1000 28.11.2008, 21:30
где-то даже слышал, что используется количество дней с какого-то фиксированного момента
соответственно, целая часть отвечает за дату, дробная - за часы-минуты-секунды

но, честно говоря, не помню уже где встречал...

Автор: Brodyaga 29.11.2008, 12:24
Цитата

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

но, честно говоря, не помню уже где встречал...


В исходниках дельфи ;)

Автор: ksnk 29.11.2008, 12:41
Все же просто. Считаем число дней, прошедшее с 1970 года (к примеру) - это - целое число.
Считаем число секунд, прошедшее с начала дня. Делим на 24*60*60 - получаем дробную часть...

Считать число дней от даты до даты - задачка несложная, но муторная. проще языковыми функциями воспольваться.

да и в double системными функциями дату перегнать значительно проще smile

Язык-то какой?

Автор: Brodyaga 29.11.2008, 17:32
Цитата

да и в double системными функциями дату перегнать значительно проще smile

Язык-то какой?


MSVC 2005, C++

Автор: ksnk 29.11.2008, 17:52
Если мне не изменяет мой склероз - под такие даты заточен класс CTime. Впрочем - не уверен, на С++ писал немного и давно smile

Автор: DenVdmj 29.11.2008, 20:19
может не надо ничего упаковывать? проще хранить секунды с начала эпохи.

Автор: Brodyaga 30.11.2008, 12:11
Цитата

может не надо ничего упаковывать? проще хранить секунды с начала эпохи.


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

Автор: Brodyaga 30.11.2008, 12:50
Hades,
Цитата

а год в каком формате, 2 или 4 цифры?


4

Цитата

        j<i
ki = sum(mj*kj) + 1;
        j=1
 
i = 1, 2, 3, 4, 5, 6;

k1 = 1;
k2 = 13;
k3 = 416;
k4 = 9984;
k5 = 599040;
k6 = 35942400;


чтото я не понял это что за числа? и почему в формуле +1? поясни пожалуйста...

Автор: Brodyaga 30.11.2008, 14:07
Цитата

Если мне не изменяет мой склероз - под такие даты заточен класс CTime. Впрочем - не уверен, на С++ писал немного и давно smile 


Это MFC. Я MFC не использую...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)