Увеличение времени и даты
От: Silverj  
Дата: 26.02.03 04:10
Оценка:
Скажите как можно увеличить время на 1 минуту или 1 час чтобы учитывался переход часа, суток, месяца, года с учетом всех особенностей: високосный год и т.д. Может у кого есть пример кода или алгоритма. Я написал процедурку, но мне она не очень нравится.
С уважением, Евгений
Re: Увеличение времени и даты
От: Аноним  
Дата: 26.02.03 05:27
Оценка:
Здравствуйте, Silverj, Вы писали:

S>Скажите как можно увеличить время на 1 минуту или 1 час чтобы учитывался переход часа, суток, месяца, года с учетом всех особенностей: високосный год и т.д. Может у кого есть пример кода или алгоритма. Я написал процедурку, но мне она не очень нравится.


Видимо ты пытаешься производить эти операции над структурами вроде tm. Лучше используй time_t или CTime.
Re: Увеличение времени и даты
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 26.02.03 05:36
Оценка:
Здравствуйте, Silverj, Вы писали:

S>Скажите как можно увеличить время на 1 минуту или 1 час чтобы учитывался переход часа, суток, месяца, года с учетом всех особенностей: високосный год и т.д. Может у кого есть пример кода или алгоритма. Я написал процедурку, но мне она не очень нравится.


Я для таких дел использую MFC'шные CTime и COleDateTime.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[2]: Увеличение времени и даты
От: Silverj  
Дата: 26.02.03 05:46
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:


SDB>Я для таких дел использую MFC'шные CTime и COleDateTime.



Забыл написать, что программа под DOS на BC 3.1 и есть конкретная дата и время в формате ДД.ММ.ГГГГ ЧЧ:ММ от которых начинается отсчет. Стандартные библиотеки мне как-то не удалось заюзать, т.к. все они используют относительное время, что не очень удобно.
С уважением, Евгений
Re: Увеличение времени и даты
От: unintruder  
Дата: 26.02.03 06:49
Оценка:
Здравствуйте, Silverj, Вы писали:

S>Скажите как можно увеличить время на 1 минуту или 1 час чтобы учитывался переход часа, суток, месяца, года с учетом всех особенностей: високосный год и т.д. Может у кого есть пример кода или алгоритма. Я написал процедурку, но мне она не очень нравится.



Это пример прибавления дней, но идея такая из структуры tm (стандартная структура определенная в time.h) переходим к time_t (число секунд начиная с midnight, January 1, 1970. )
прибавляем сколько нужно и переходим обратно

#include <time.h>

#define datedelta (int)(719163)

int is_leap_year(int year)
{
    return ( ( 0==year % 4 ) && ( ( 0 != year % 100 ) || ( 0 == year % 400 ) ) )?1:0;
}

long daytable(int month,int year)
{
const long days[12] = {
        31,  //Jan
        28,  //Feb
        31,  //March
        30,  //April
        31,  //May
        30,  //June
        31,  //July
        31,  //Aug
        30,  //Sep
        31,  //Oct
        30,  //Nov
        31   //Dec
                };
 if (2!= month) return days[month-1];

 return is_leap_year(year)? 29:28;

}

/*===============================================================
 dateoper() -
 ================================================================ */
char* dateoper (int* i)
{
    char *datebuf = (char *)malloc(10+1);
    struct tm tm_buf;
    struct tm *ptm_buf;
    long j = 0;
    long date;
    long iday;
    long mon;
    long iyear;
    long k;

    /* Get time as long integer. */
    time( &j );
    ptm_buf = localtime(&j); 
    tm_buf = *ptm_buf;

    // Add days
    iday = tm_buf.tm_mday;
    mon = tm_buf.tm_mon + 1;
    iyear = tm_buf.tm_year + 1900;

    for ( k = 1;k <= mon - 1;k++){
        iday+=(long)daytable( k, iyear);
    };    
    k = iyear - 1;
    date =(long)(k*365 + k/4 - k/100 + k/400 + iday+(long)(*i));
    j = (long)(date - datedelta)*24*3600;
    ptm_buf=localtime(&j);
    strftime(datebuf,11,"%d.%m.%Y",ptm_buf);
    datebuf[10]='\0';
    return datebuf;
}
Re[3]: Увеличение времени и даты
От: Аноним  
Дата: 26.02.03 07:15
Оценка:
Здравствуйте, Silverj, Вы писали:

S>

S>Забыл написать, что программа под DOS на BC 3.1 и есть конкретная дата и время в формате ДД.ММ.ГГГГ ЧЧ:ММ от которых начинается отсчет. Стандартные библиотеки мне как-то не удалось заюзать, т.к. все они используют относительное время, что не очень удобно.

А удобно некое абсолютное? От сотворения мира что ли?
Чего проще сделать так:

1. Заполни tm своим начальным временем ДД.ММ...
2. Получи time_t с помощью mktime
3. Производи над time_t арифметические операции
4. Конвертируй обратно в tm и дальше в свой ДД.ММ...
Re: Увеличение времени и даты
От: _ks_  
Дата: 19.10.04 07:55
Оценка:
Здравствуйте, Silverj, Вы писали:

S>Скажите как можно увеличить время на 1 минуту или 1 час чтобы учитывался переход часа, суток, месяца, года с учетом всех особенностей: високосный год и т.д. Может у кого есть пример кода или алгоритма. Я написал процедурку, но мне она не очень нравится.


Возникла у меня та же проблема, а громоздкое решение, предложенное unintruder, может добавить много новых багов.
А некий товарищ Аноним не показал кода, который такое реализовывает на ANSI C (а только идею подкинул).
Срочно пришлось искать нормальный (стандартный) путь решения.
MSDN знает как такое решать. Привожу код (даже не знаю зачем ), который вычилсляет вчерашний день.

#include <time.h>
#include <stdio.h>

struct tm *newtime;
time_t aclock;

void main( void )
{
   time( &aclock );                 /* Get time in seconds */
   
   newtime = localtime( &aclock );  /* Convert time to struct tm */

   /* Print local time as a string */
   printf( "The current date and time are: %s", asctime( newtime ) );

   aclock-=24*60*60; 
   newtime = localtime( &aclock );  /* Convert time to struct tm */

   /* Print yesterday time as a string */
   printf( "The yesterday date and time are: %s", asctime( newtime ) );
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.