Генератор дат, нужна помощь

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Re: Генератор дат, нужна помощь

Сообщение Ravil » 06.01.2011 18:03:36

Буду допиливать первый вариант. Спасибо за помощь.
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Генератор дат, нужна помощь

Сообщение Nik » 06.01.2011 18:14:57

Padre_Mortius писал(а):С UnixToDateTime точно не будет работать

А куда оно денется? Генерим int-число в нужном диапазоне, преобразуем в дату, при необходимости - форматируем, отрезая время.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Генератор дат, нужна помощь

Сообщение Ravil » 06.01.2011 18:47:07

"преобразуем в дату" - а можно подробнее.
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Генератор дат, нужна помощь

Сообщение alexs » 06.01.2011 19:08:50

Ravil
Посмотри - как объявлен тип TDateTime. Там нет ни какой магии - на самом деле - это число дней, прошедшее с определённой даты.
Дробная часть - это время в сутках.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4062
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Генератор дат, нужна помощь

Сообщение Nik » 06.01.2011 20:51:15

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;


Что они делают, думаю, понятно.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Генератор дат, нужна помощь

Сообщение Vadim » 06.01.2011 20:53:07

Ravil
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.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Генератор дат, нужна помощь

Сообщение Ravil » 06.01.2011 22:26:54

Спасибо большое. Может посоветуете книгу, ссылку на скачку книги для изучения Pascal.

Добавлено спустя 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 - почему?
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Генератор дат, нужна помощь

Сообщение Nik » 07.01.2011 00:30:52

Если нужна книга по FreePascal/Lazarus - то вот, например: viewtopic.php?f=5&t=6346&p=48473&hilit=%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0#p48473

Код: Выделить всё
Прога выдала 11.14.2037 - почему?

Подозреваю, что виновата функция UnpackTime.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Генератор дат, нужна помощь

Сообщение Иван Шихалев » 07.01.2011 03:00:23

Не могу не заметить, что ссылка http://freepascal.ru/download/pdf/osnov ... azarus.pdf есть на главной странице FreePascal.ru...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Генератор дат, нужна помощь

Сообщение Vadim » 07.01.2011 05:53:55

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.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Генератор дат, нужна помощь

Сообщение Ravil » 07.01.2011 11:20:48

Проще допилить первый вариант. Спасибо за помощь.
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Генератор дат, нужна помощь

Сообщение Vadim » 07.01.2011 11:33:43

Ravil
А Вы поняли, в чём была проблема с Вашим первым вариантом?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Генератор дат, нужна помощь

Сообщение dunin » 07.01.2011 15:14:37

Vadim писал(а):...
Дело в том, что процедуры Pack\UnpackTime не проверяют формат даты на правильность. Так что Вам нужна дополнительная функция проверки. Что-то типа:
...

Функция конвертации строки в дату/время с проверкой валидности даты: TryStrToDateTime
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Генератор дат, нужна помощь

Сообщение Ravil » 07.01.2011 15:36:36

Нужно типы состыковать.
Аватара пользователя
Ravil
новенький
 
Сообщения: 27
Зарегистрирован: 05.01.2011 13:54:46
Откуда: Стрежевой

Re: Генератор дат, нужна помощь

Сообщение Vadim » 07.01.2011 15:41:38

dunin
Человека заставляют пользоваться вымершими динозаврами - ТР. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Пред.След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Рейтинг@Mail.ru