15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту

Borland C++ Builder FAQ
Составлен по материалам форума на Исходниках.Ru
Содержание Последнее обновление: 14.02.2004

Дата и время( TDateTime ) - общие вопросы

Автор(ы): KAV, trainer
Исходная ссылка: - - -

Для начала краткая информация: TDateTime - по сути всего лишь число с плавающей точкой двойной точности, со всеми вытекающими последствиями. То есть , например, для того, чтобы вычислить разницу между двумя датами, достаточно вычесть одно из другого:
TDateTime datetime1 = ...;
TDateTime datetime2 = ...;
double difference = (double)( datetime2 - datetime1 );
При этом получившееся значение будет представлять точное значение с учетом дней, часов, минут и секунд. Например, значение 3.25 - это три дня и еще 0.25 дня( т.е. 6 часов )

Как узнать текущие дату и/или время?
Нет ничего проще:
TDateTime CurrentDate = Date();	// это текущая дата
TDateTime CurrentTime = Time();	// это текущее время
TDateTime CurrentDateTime = Now(); // это текущие дата и время


Как сдвинуть дату на заданный промежуток?
TDateTime datetime = ...;
datetime += 1.0 / 24;		   // сдвигаем на час вперед
datetime -= 1.0;		   // сдвигам на день назад
datetime += 7.0;		   // сдвигаем на неделю вперед
datetime = IncMonth( datetime, -1 );  // сдвигаем на месяц назад


Как определить день недели?
TDateTime datetime = ...;
int day_of_week = ( datetime.DayOfWeek() + 5 ) % 7; // считаем с понедельника и с нуля


Как определить номер недели в году?
Следует иметь в виду, что первая неделя в году может быть неполной.
int week_num;
Word year, month, day;
TDateTime dt = ...;			// "подопытная" дата
dt.DecodeDate(&year,&month,&day);	// раскладываем нашу дату на составляющие
TDateTime _1_jan(year,1,1);		// 1-е января того года, которому соответствует дата
int _1_jan_day_of_week = (_1_jan.DayOfWeek()+5)%7; // день недели 1-го января
week_num = (int)(dt-TDateTime(year,1,1)+_1_jan_day_of_week)/7; // искомый номер недели(с 0)


Как узнать, сколько дней в месяце?
Количество дней в месяце хранится в глобальном массиве MonthDays, получить значение можно так:
MonthDays[IsLeapYear(номер_года)][номер_месяца]


Как изменить один из компонентов TDateTime, не затрагивая другой?
TDateTime datetime1 = ...;
TDateTime datetime2 = ...;
ReplaceDate(datetime1,datetime2);  // datetime1 теперь содержит ту же дату, что и datetime2
				   //  но время осталось прежним
ReplaceTime(datetime2,datetime1);  // а теперь datetime2 содержит то же время, что и datetime1
				   //  но дата осталась прежней


Как определить, является ли год високосным?
Для этого надо использовать функцию IsLeapYear. Например, следующий код покажет окно с текстом о том, является ли год високосным или нет:
int year = 2100;  // тут какой надо год
ShowMessage( IntToStr(year) + " год - " + ((IsLeapYear(year)) ? "" : "не ") + "високосный" );
Как видно, функция IsLeapYear принимает параметр - год и возвращает true, если он високосный и false в противном случае.

P.S. Троеточие в примерах заменяет некоторое выражение, позволяющее записать в объект корректное значение.