Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2011, 15:47   #1
flug
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 48
По умолчанию FormatDateTime - вывод времени

Подскажите пожалуйста, у меня есть время в миллисекундах и я хочу вывести его в формате "количество дней:часы:минуты:секунды" Вот например имеется 140516988 миллисекунд и должно получится 01:15:01:56, но не получается и выходит 31:15:01:56. Делаю так FormatDateTime ('dd:hh:nn:ss', 140516988 / (1000 * 24 * 60 * 60)); Что не так делаю?
flug вне форума Ответить с цитированием
Старый 10.08.2011, 16:08   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Вот например имеется 140516988 миллисекунд
sorry не заметил
Цитата:
/ (1000 * 24 * 60 * 60)
Tdatetime F1
Цитата:
Following are some examples of TDateTime values and their corresponding dates and times:

0 12/30/1899 12:00 am
2.75 1/1/1900 6:00 pm
-1.25 12/29/1899 6:00 am
35065 1/1/1996 12:00 am
смотри что есть "нулевая" дата(выделено).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.08.2011 в 16:34.
evg_m на форуме Ответить с цитированием
Старый 10.08.2011, 16:28   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
FormatDateTime ('dd:hh:nn:ss',
          TimeStampToDateTime( MSecsToTimeStamp(140516988) ));
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.08.2011, 09:43   #4
flug
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 48
По умолчанию

Большое спасибо за ответы, но....

evg_m
Честно говоря я ничего не понял.

Serge_Bliznykov
Код работает, но не всегда, вот например почему-то если попытаться преобразовать 1179867 мсек. (это 19мин. 39 сек.), то вылетает ошибка "0.1179867 is not a valid timestamp". Совершенно не понятно в чём дело.
flug вне форума Ответить с цитированием
Старый 11.08.2011, 10:35   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
если попытаться преобразовать 1179867 мсек. (это 19мин. 39 сек.), то вылетает ошибка "0.1179867 is not a valid timestamp". Совершенно не понятно в чём дело.
эти "мудрецы" в новых версиях Delphi добавили проверку на валидность даты...

там такое
Цитата:
Код:
procedure ValidateTimeStamp(const TimeStamp: TTimeStamp);
begin
  if (TimeStamp.Time < 0) or (TimeStamp.Date <= 0) then
    ConvertErrorFmt(@SInvalidTimeStamp, [TimeStamp.Date, TimeStamp.Time]);
end;
т.е. дата не может быть меньше или равна нулю...
зачем они это сделали?! Не знаю... видимо, где-то вылазили косяки...


Как вариант обхода, предлагаю Вам такое решение
(использовать старую процедуру преобразования, без проверки):
Код:
const
  FMSecsPerDay: Single = MSecsPerDay;
  IMSecsPerDay: Integer = MSecsPerDay;

function OldTimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
asm
        MOV     ECX,[EAX].TTimeStamp.Time
        MOV     EAX,[EAX].TTimeStamp.Date
        SUB     EAX,DateDelta
        IMUL    IMSecsPerDay
        OR      EDX,EDX
        JNS     @@1
        SUB     EAX,ECX
        SBB     EDX,0
        JMP     @@2
@@1:    ADD     EAX,ECX
        ADC     EDX,0
@@2:    PUSH    EDX
        PUSH    EAX
        FILD    QWORD PTR [ESP]
        FDIV    FMSecsPerDay
        ADD     ESP,8
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := FormatDateTime ('dd:hh:nn:ss',
     OldTimeStampToDateTime( MSecsToTimeStamp(1179867) ) );

end;

Последний раз редактировалось Serge_Bliznykov; 11.08.2011 в 11:09.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.08.2011, 11:30   #6
flug
Пользователь
 
Регистрация: 23.07.2009
Сообщений: 48
По умолчанию

Serge_Bliznykov
Огромное вам спасибо за помощь и разъяснения!
flug вне форума Ответить с цитированием
Старый 10.05.2012, 14:12   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Если кто-то ещё столкнётся, я решил подобную проблемку вот таким образом:
Код:
FormatDateTime('hh:nn:ss', TimeStampToDateTime(MSecsToTimeStamp(MSecsPerDay + endtime)));
т.е. просто добавив к количеству миллисекунд константу (она в SysUtils) соответствующую одним суткам

Обращаю внимание, что в этом случае (а именно когда выводим только в пределах меньше 1 суток, со строкой форматирования 'hh:nn:ss' и подобными, без дней и т.д.) всё ок, но при попытке работать с большими диапазонами надо учитывать, что вручную добавлены 1 сутки
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод сообщения по времени DimOn4Ik БД в Delphi 12 31.03.2010 23:00
Форматированный вывод даты и времени, БД mssql zvezda_t PHP 2 09.02.2010 09:18
Вывод времени в консоль. BlincAttack Общие вопросы .NET 2 06.10.2009 14:57
Вывод даты и времени. mephist Microsoft Office Excel 2 12.08.2009 10:44
Вывод даты и времени (assembler) olen` Помощь студентам 0 05.06.2009 22:45