|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Секунды и TDateTime
Добрый вечер гуру ) Помогите решить такую задачу, нормального алгоритма не нашол (не учитывают кол-во дней в месяце и високосный год). Смысл такой, есть кол-во секунд 35475579, нужно получить из них такие дату и время: 08.02.2010 17:19:39. Отсчет начинается с 01.01.2009 00:00:00...Помогите кто может. Заранее спасибо
|
#2
|
|||
|
|||
Да все просто. Пользуйся тем, что 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
|
||||
|
||||
спасибо )) ошибочка есть, заместо 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
|
|||
|
|||
Может у тебя данные не правильные. В смысле, кол-во секунд...
|
#5
|
||||
|
||||
та вот в том то и дело, что правильные ((((( если брать данные за 2009 год, например за февраль, то Ваша функция работает правильно если за 2010, то уже нет ((( и чем больше год и дата, тем на большее кол-во дней ошибка, в перёд... такой ощущение, что не учитываицца 30(31) день в месяце, и високосный год.
Последний раз редактировалось Ultras, 09.02.2010 в 20:04. |
#6
|
|||
|
|||
Сейчас проверил. В днях получается 410 дней. Ну хоть ты лопни, хоть тресни - это год и полтора месяца ровно. Т.е. 15 февраля.
Проверь, все-таки исходное кол-во секунд... |
#7
|
||||
|
||||
та вот уже проверил раз 10 ))) за 19.02.2009 проверил, всё идеально работает, стоит взять 2011 год, ошибка дней на 15
|
#8
|
|||
|
|||
Все учитывается.
Скоре всего мы что-то не знаем - где-то там есть какая-то хитрость. Просто слишком уж большая ошибка получается. Из за високосного года такого быть не может - ошибка в неделю... Тем более, что тип TDateTime и все связанные с ним функции прекрасно учитывают все особенности. Они сами работают почти какже, как и твой вариант - дата отсчета другая и хранят, как уже писал, дни - в целой части, время - в дробной. |
#9
|
||||
|
||||
ну это я всё знаю (((( пойду дальше мучать, там просто данные побитно вытаскиваю из куска файла, на время и дату отведено 30 бит, как разберусь, отпишусь )) спасибо за помощь в любом случае ))
Последний раз редактировалось Ultras, 09.02.2010 в 20:16. |
#10
|
||||
|
||||
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; Может там откуда берешь секунды вычисляется по другому а не просто разница ? |
#11
|
||||
|
||||
Цитата:
Цитата:
|
#12
|
||||
|
||||
Похоже в той программе используется приблизительно такая функция:
Код:
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
|
||||
|
||||
s0Creator, благодарствую добрый человек, спасибо, всё работает как надо теперь
|
#14
|
|||
|
|||
Кнопка из калькулятора
Народ,вопрос немного не по теме:как сделать так,чтобы жмешь на кнопку и в эдите пишется цифра(как в калькуляторе)???????
|
#15
|
||||
|
||||
Код:
OnButton1.Click begin Edit1.Text := Edit1.Text+'1';//К имеющемуся тексту добавляется 1 end; В начале был Бит, потом Байт и только потом появилось Слово... |