Генератор дат, нужна помощь
Модератор: Модераторы
Буду допиливать первый вариант. Спасибо за помощь.
"преобразуем в дату" - а можно подробнее.
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
Ravil писал(а):"преобразуем в дату" - а можно подробнее.
Вот парочка очень полезных функций:
Код: Выделить всё
const
SecPerDay = 86400;
Offset1970 = 25569;
function UnixTimeToDateTime(UnixTime : LongInt): TDate;
begin
Result:= UnixTime / SecPerDay + Offset1970;
end;
function DateTimeToUnixTime(DelphiDate: TDate): LongInt;
begin
Result:= Trunc((DelphiDate - Offset1970) * SecPerDay);
end;Что они делают, думаю, понятно.
Ravil
PackTime() - UnpackTime(). По-моему в TurboPascal это было. В модуле DOS.
Добавлено спустя 11 минут 8 секунд:
PackTime() - UnpackTime(). По-моему в TurboPascal это было. В модуле DOS.
Добавлено спустя 11 минут 8 секунд:
Код: Выделить всё
Uses Dos;
Var
dt: DateTime;
ut: LongInt;
Begin
Randomize;
//Задаём максимальную дату
dt.Year:=2100;
dt.Month:=12;
dt.Day:=31;
//Генерируем дату
PackTime(dt, ut);
ut:=Random(ut);
UnpackTime(ut, dt);
//Выводим полученную дату на экран
WriteLn(dt.Day, '.', dt.Month, '.', dt.Year);
End.Спасибо большое. Может посоветуете книгу, ссылку на скачку книги для изучения Pascal.
Добавлено спустя 15 минут 58 секунд:
Так тоже можно:
Добавлено спустя 10 минут 10 секунд:
А как сделать, чтобы год выводился двумя цифрами?
Добавлено спустя 31 минуту 37 секунд:
Прога выдала 11.14.2037 - почему?
Добавлено спустя 15 минут 58 секунд:
Так тоже можно:
Код: Выделить всё
Uses Dos;
Var
dt: DateTime;
ut: LongInt;
Begin
Randomize;
ut:=Random(4102358400) ;
UnpackTime(ut, dt);
//Выводим полученную дату на экран
WriteLn(dt.Day, '.', dt.Month, '.', dt.Year);
End.Добавлено спустя 10 минут 10 секунд:
А как сделать, чтобы год выводился двумя цифрами?
Добавлено спустя 31 минуту 37 секунд:
Прога выдала 11.14.2037 - почему?
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
Если нужна книга по FreePascal/Lazarus - то вот, например: viewtopic.php?f=5&t=6346&p=48473&hilit=%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0#p48473
Подозреваю, что виновата функция UnpackTime.
Код: Выделить всё
Прога выдала 11.14.2037 - почему?Подозреваю, что виновата функция UnpackTime.
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
Не могу не заметить, что ссылка http://freepascal.ru/download/pdf/osnov ... azarus.pdf есть на главной странице FreePascal.ru...
Ravil писал(а):Прога выдала 11.14.2037 - почему?
Дело в том, что процедуры Pack\UnpackTime не проверяют формат даты на правильность. Так что Вам нужна дополнительная функция проверки. Что-то типа:
Код: Выделить всё
If dt.Month>12 Then dt.Month:=12;
Case dt.Month of
1,3,5,7,8,10,12: If dt.Day>31 Then dt.Day:=31;
4,6,9,11: If dt.Day>30 Then dt.Day:=30;
2: If dt.Day>28 Then dt.Day:=28;
end;Плюс проверка года на високосность, дабы не упустить 29 февраля.
Ravil писал(а):А как сделать, чтобы год выводился двумя цифрами?
Если у Вас широкий диапазон дат, то это неразумно, т.к. Вы не сможете отличить год 2000 от года 2100.
Проще допилить первый вариант. Спасибо за помощь.
Ravil
А Вы поняли, в чём была проблема с Вашим первым вариантом?
А Вы поняли, в чём была проблема с Вашим первым вариантом?
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Vadim писал(а):...
Дело в том, что процедуры Pack\UnpackTime не проверяют формат даты на правильность. Так что Вам нужна дополнительная функция проверки. Что-то типа:
...
Функция конвертации строки в дату/время с проверкой валидности даты: TryStrToDateTime
Нужно типы состыковать.
dunin
Человека заставляют пользоваться вымершими динозаврами - ТР.
Человека заставляют пользоваться вымершими динозаврами - ТР.
