Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.02.2010, 18:55
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию Секунды и TDateTime

Добрый вечер гуру ) Помогите решить такую задачу, нормального алгоритма не нашол (не учитывают кол-во дней в месяце и високосный год). Смысл такой, есть кол-во секунд 35475579, нужно получить из них такие дату и время: 08.02.2010 17:19:39. Отсчет начинается с 01.01.2009 00:00:00...Помогите кто может. Заранее спасибо
Ответить с цитированием
  #2  
Старый 09.02.2010, 19:02
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да все просто. Пользуйся тем, что TDateTime есть число с фиксированой точкой, где целая часть - дни, а дробная - время:

Код:
function SecToDate(ASec : Integer) : TDateTime;
const
  SecsInDay = 24 * 60 * 60; // секунд в дне
var
  ZeroDate : TDateTime;
  InDays : Integer;
  ModSecs : Integer;
begin
  ZeroDate := EncodeDate(1,1,2009); // точка отсчета
  InDays := ASec div SecsInDay; // дней в переданных секундах
  ModSecs := ASec mod SecsInDay; // оставшиеся секунды

  // Вычислфем результат
  Result := ZeroDate + InDays + ModSecs / SecsInDay;
end;
Ответить с цитированием
  #3  
Старый 09.02.2010, 19:17
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию

спасибо )) ошибочка есть, заместо EncodeDate(1,1,2009), надо EncodeDate(2009,1,1), и на выходе получаицца: 15.02.2010 14:19:39 (то что 14 часов то ладно, там +3 надо прибавлять, GMT и т.д., а как с датой быть, не знаю).. Ошибочно ((( не могу понять как программа вычисляет другая ((( исходников на неё нету...

Странно, когда делаю так:
d1 := EncodeDateTime(2009,1,1,0,0,0,0);
d2 := EncodeDateTime(2010,2,8,14,19,39,0);
d := DaySpan(d1,d2);
Caption := FloatToStr(d*86400);

получаю 34870778.999999, число меньше чем дано (( ничо не пойму

Последний раз редактировалось Ultras, 09.02.2010 в 19:47.
Ответить с цитированием
  #4  
Старый 09.02.2010, 19:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Может у тебя данные не правильные. В смысле, кол-во секунд...
Ответить с цитированием
  #5  
Старый 09.02.2010, 19:59
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию

та вот в том то и дело, что правильные ((((( если брать данные за 2009 год, например за февраль, то Ваша функция работает правильно если за 2010, то уже нет ((( и чем больше год и дата, тем на большее кол-во дней ошибка, в перёд... такой ощущение, что не учитываицца 30(31) день в месяце, и високосный год.

Последний раз редактировалось Ultras, 09.02.2010 в 20:04.
Ответить с цитированием
  #6  
Старый 09.02.2010, 20:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Сейчас проверил. В днях получается 410 дней. Ну хоть ты лопни, хоть тресни - это год и полтора месяца ровно. Т.е. 15 февраля.

Проверь, все-таки исходное кол-во секунд...
Ответить с цитированием
  #7  
Старый 09.02.2010, 20:08
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию

та вот уже проверил раз 10 ))) за 19.02.2009 проверил, всё идеально работает, стоит взять 2011 год, ошибка дней на 15
Ответить с цитированием
  #8  
Старый 09.02.2010, 20:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Все учитывается.
Скоре всего мы что-то не знаем - где-то там есть какая-то хитрость.
Просто слишком уж большая ошибка получается. Из за високосного года такого быть не может - ошибка в неделю... Тем более, что тип TDateTime и все связанные с ним функции прекрасно учитывают все особенности. Они сами работают почти какже, как и твой вариант - дата отсчета другая и хранят, как уже писал, дни - в целой части, время - в дробной.
Ответить с цитированием
  #9  
Старый 09.02.2010, 20:13
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию

ну это я всё знаю (((( пойду дальше мучать, там просто данные побитно вытаскиваю из куска файла, на время и дату отведено 30 бит, как разберусь, отпишусь )) спасибо за помощь в любом случае ))

Последний раз редактировалось Ultras, 09.02.2010 в 20:16.
Ответить с цитированием
  #10  
Старый 16.02.2010, 09:45
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Ultras
А Ты уверен, что 35475579 соответствует 08.02.2010 17:19:39.

Провел эксперимент:
Код:
function SecToDate(ASec : Integer) : TDateTime;
begin
  Result := EncodeDate(2009,1,1) + (ASec / SecsPerDay);
end;

procedure TForm1.btDateClick(Sender: TObject);
var
  i: Integer;
  tmpDt: TDateTime;
begin
  for i := 0 to 1000 do
  begin
    tmpDt := SecToDate(i * SecsPerDay);
    if DayOfTheMonth(tmpDt) = 1 then
      memo1.Lines.Add('');
    Memo1.Lines.Add(DateTimeToStr(tmpDt) + ' - ' + IntToStr(i * SecsPerDay));
  end;
end;
Вывелся "календарь" на 1000 дней - где надо 31 где надо 28. и твое число попадает в 15.02.2010.

Может там откуда берешь секунды вычисляется по другому а не просто разница ?
Ответить с цитированием
  #11  
Старый 16.02.2010, 10:53
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию

Цитата:
Сообщение от s0Creator
Ultras
А Ты уверен, что 35475579 соответствует 08.02.2010 17:19:39.
точно уверен что 35475579 соответствует 08.02.2010 17:19:39, программа показывает именно так
Цитата:
Может там откуда берешь секунды вычисляется по другому а не просто разница ?
а вот этого не знаю (((
Ответить с цитированием
  #12  
Старый 16.02.2010, 11:11
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Похоже в той программе используется приблизительно такая функция:
Код:
function SecToDateEx(ASec : Integer) : TDateTime;
var
  Year, Month, Day, SecInDay: Integer;
begin
  SecInDay := ASec mod SecsPerDay;
  ASec := ASec div SecsPerDay;

  Day := ASec mod 31;
  ASec := ASec div 31;

  Month := ASec mod 12;
  Year := ASec div 12;

  Result := EncodeDate(2009 + Year,1 + Month,1 + Day) + (SecInDay / SecsPerDay);
end;
Проверь.
Ответить с цитированием
  #13  
Старый 16.02.2010, 11:16
Аватар для Ultras
Ultras Ultras вне форума
Начинающий
 
Регистрация: 09.02.2010
Адрес: Россия / Ставрополь
Сообщения: 138
Репутация: 475
По умолчанию

s0Creator, благодарствую добрый человек, спасибо, всё работает как надо теперь
Ответить с цитированием
  #14  
Старый 25.02.2010, 15:50
lol lol вне форума
Прохожий
 
Регистрация: 25.02.2010
Сообщения: 1
Репутация: 10
Вопрос Кнопка из калькулятора

Народ,вопрос немного не по теме:как сделать так,чтобы жмешь на кнопку и в эдите пишется цифра(как в калькуляторе)???????
Ответить с цитированием
  #15  
Старый 25.02.2010, 16:00
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Код:
OnButton1.Click
begin
 Edit1.Text := Edit1.Text+'1';//К имеющемуся тексту добавляется 1
end;
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter