Скажите как можно увеличить время на 1 минуту или 1 час чтобы учитывался переход часа, суток, месяца, года с учетом всех особенностей: високосный год и т.д. Может у кого есть пример кода или алгоритма. Я написал процедурку, но мне она не очень нравится.
С уважением, Евгений
Re: Увеличение времени и даты
От:
Аноним
Дата:
26.02.03 05:27
Оценка:
Здравствуйте, Silverj, Вы писали:
S>Скажите как можно увеличить время на 1 минуту или 1 час чтобы учитывался переход часа, суток, месяца, года с учетом всех особенностей: високосный год и т.д. Может у кого есть пример кода или алгоритма. Я написал процедурку, но мне она не очень нравится.
Видимо ты пытаешься производить эти операции над структурами вроде tm. Лучше используй time_t или CTime.
Здравствуйте, Silverj, Вы писали:
S>Скажите как можно увеличить время на 1 минуту или 1 час чтобы учитывался переход часа, суток, месяца, года с учетом всех особенностей: високосный год и т.д. Может у кого есть пример кода или алгоритма. Я написал процедурку, но мне она не очень нравится.
Я для таких дел использую MFC'шные CTime и COleDateTime.
SDB>Я для таких дел использую MFC'шные CTime и COleDateTime.
Забыл написать, что программа под DOS на BC 3.1 и есть конкретная дата и время в формате ДД.ММ.ГГГГ ЧЧ:ММ от которых начинается отсчет. Стандартные библиотеки мне как-то не удалось заюзать, т.к. все они используют относительное время, что не очень удобно.
Здравствуйте, 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 и дальше в свой ДД.ММ...
Здравствуйте, 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 ) );
}