Страница 2 из 3

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

Добавлено: 06.01.2011 17:03:36
Ravil
Буду допиливать первый вариант. Спасибо за помощь.

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

Добавлено: 06.01.2011 17:14:57
Nik
Padre_Mortius писал(а):С UnixToDateTime точно не будет работать

А куда оно денется? Генерим int-число в нужном диапазоне, преобразуем в дату, при необходимости - форматируем, отрезая время.

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

Добавлено: 06.01.2011 17:47:07
Ravil
"преобразуем в дату" - а можно подробнее.

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

Добавлено: 06.01.2011 18:08:50
alexs
Ravil
Посмотри - как объявлен тип TDateTime. Там нет ни какой магии - на самом деле - это число дней, прошедшее с определённой даты.
Дробная часть - это время в сутках.

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

Добавлено: 06.01.2011 19:51:15
Nik
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;


Что они делают, думаю, понятно.

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

Добавлено: 06.01.2011 20:04:15
Vadim
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.

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

Добавлено: 06.01.2011 22:24:39
Ravil
Спасибо большое. Может посоветуете книгу, ссылку на скачку книги для изучения 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 - почему?

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

Добавлено: 06.01.2011 23:30:52
Nik
Если нужна книга по 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.

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

Добавлено: 07.01.2011 02:00:23
Иван Шихалев
Не могу не заметить, что ссылка http://freepascal.ru/download/pdf/osnov ... azarus.pdf есть на главной странице FreePascal.ru...

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

Добавлено: 07.01.2011 04:53:55
Vadim
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.

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

Добавлено: 07.01.2011 10:20:48
Ravil
Проще допилить первый вариант. Спасибо за помощь.

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

Добавлено: 07.01.2011 10:33:43
Vadim
Ravil
А Вы поняли, в чём была проблема с Вашим первым вариантом?

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

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

Функция конвертации строки в дату/время с проверкой валидности даты: TryStrToDateTime

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

Добавлено: 07.01.2011 14:36:36
Ravil
Нужно типы состыковать.

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

Добавлено: 07.01.2011 14:41:38
Vadim
dunin
Человека заставляют пользоваться вымершими динозаврами - ТР. :)