Дата и Время
Последнее обновление этого раздела FAQ: November 3, 2006
ДАТА И ВРЕМЯ
1.Как узнать текущие дату и/или время?
2.Дата и время( TDateTime ) - общие вопросы
3.Как сдвинуть дату на заданный промежуток?
4. Как определить день недели?
5.Как определить номер недели в году?
6.Как узнать, сколько дней в месяце?
7.Как изменить один из компонентов TDateTime, не затрагивая другой?
8.Как определить, является ли год високосным?
9.Преобразование файлового времени в объект TDateTime
10.Получение дня недели (VCL вариант)
1.Как узнать текущие дату и/или время?
Нет ничего проще:
TDateTime CurrentDate = Date(); // это текущая
дата
TDateTime CurrentTime = Time(); // это текущее время
TDateTime CurrentDateTime = Now(); // это текущие дата и время
2.Дата и время( TDateTime ) - общие вопросы
Для начала краткая информация: TDateTime - по сути всего лишь число
с плавающей точкой двойной точности, со всеми вытекающими последствиями. То
есть , например, для того, чтобы вычислить разницу между двумя датами, достаточно
вычесть одно из другого:
TDateTime datetime1 = ...;
TDateTime datetime2 = ...;
double difference = (double)( datetime2 - datetime1 );
При этом получившееся значение будет представлять точное значение с учетом дней,
часов, минут и секунд. Например, значение 3.25 - это три дня и еще 0.25 дня(
т.е. 6 часов )
3.Как сдвинуть дату на заданный промежуток?
TDateTime datetime = ...;
datetime += 1.0 / 24; //
сдвигаем на час вперед
datetime -= 1.0; // сдвигам на день назад
datetime += 7.0; // сдвигаем на неделю вперед
datetime = IncMonth( datetime, -1 ); // сдвигаем на месяц назад
4. Как определить день недели?
TDateTime datetime = ...;
int day_of_week = ( datetime.DayOfWeek() + 5 ) % 7; // считаем с понедельника
и с нуля
5.Как определить номер недели в году?
Следует иметь в виду, что первая неделя в году может быть
неполной.
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)
6.Как узнать, сколько дней в месяце?
Количество дней в месяце хранится в глобальном массиве
MonthDays, получить значение можно так:
MonthDays[IsLeapYear(номер_года)][номер_месяца]
7.Как изменить один из компонентов TDateTime, не затрагивая
другой?
TDateTime datetime1 = ...;
TDateTime datetime2 = ...;
ReplaceDate(datetime1,datetime2); // datetime1 теперь содержит ту же
дату, что и datetime2
// но время осталось прежним
ReplaceTime(datetime2,datetime1); // а теперь datetime2 содержит то
же время, что и datetime1
// но дата осталась прежней
8.Как определить, является ли год високосным?
Для этого надо использовать функцию IsLeapYear. Например, следующий код покажет
окно с текстом о том, является ли год високосным или нет:
int year = 2100; //
тут какой надо год
ShowMessage( IntToStr(year) + " год - " + ((IsLeapYear(year))
? "" : "не ") + "високосный" );Как
видно, функция IsLeapYear принимает параметр - год и возвращает true, если он
високосный и false в противном случае.
P.S. Троеточие в примерах заменяет некоторое выражение, позволяющее записать
в объект корректное значение.
9.Преобразование файлового времени в объект TDateTime
Используйте следующую функцию для преобразования файлового времени в объект
TDateTime:
TDateTime __fastcall TSTFLFileInfo::FileTimeToDateTime(FILETIME
&AFileTime)
{
SYSTEMTIME SystemTime;
FILETIME LocalFileTime;
FileTimeToLocalFileTime(&AFileTime, &LocalFileTime);
FileTimeToSystemTime(&LocalFileTime, &SystemTime);
TDateTime DateTime = SystemTimeToDateTime(SystemTime);
return DateTime;
}
10.Получение дня недели (VCL вариант)
Для получения дня недели воспользуйтесь функцией DayOfWeek() из модуля Sysutils,
передав ей текущую дату. DayOfWeek возвращает значение от 1 до 7, где 1 - воскресенье,
2 - понедельник, и т. д.
int Day = DayOfWeek(Date());
Author of article - MA F*CKA CREW 2006
www.builderhelper.3dn.ru
builder.helper@rambler.ru