Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > [BCB2009] TDateTime - Результат сравнения |
Автор: MuForum 13.9.2009, 17:00 | ||
Доброе время суток. Работаю на "Borland C++ Builder 2009". # Задача: Сравнить два объекта TDateTime и вернуть результат разницы дней, часов, минут и секунд в строке. - Возвращаемый результат: XX days HH:mm:ss; (01 days 12:03:15) - Я решил эту задачу, однако реализация мне не очень нравится.
P.S. -> Если кто-то может предложить лучший способ вычисления, буду рад. |
Автор: Efs 13.9.2009, 18:24 |
Хм.. а почему бы не оперировать с типами TDateTime, встроенными в BCPP, а не со строками ? |
Автор: smoke_man 13.9.2009, 18:41 | ||
Например, так:
|
Автор: MuForum 13.9.2009, 22:44 | ||||
Данный способ хорош, НО, он не правильно определяет дату. (год, месяц, день) |
Автор: Efs 14.9.2009, 06:28 | ||
Есть одна хорошая штука в билдере - DateTimePicker. С него можно брать заданную дату и время:
Получив дату и время таким образом, можно выполнять сравнение. Другое дело, если вы будете брать данные из файлов. |
Автор: MuForum 14.9.2009, 07:54 | ||||||||
Вы не поняли задачу. С получением даты и времени проблем не возникает. Проблема возникает с вычитанием двух TDateTime -> Результат времени корректен, а вот результат даты нет.
- Я тоже так сделал в первый раз, но из-за не корректного результата даты отказался. - Может я что-то не так делаю, подскажите. P.S. -> Ещё раз уточняю задание. Есть два объекта TDateTime, мне необходимо получить их разность. Добавлено @ 08:03 Кстати, пробовал и в ручную получить разницу даты и записать в класс TDateTime, однако выдаёт ошибку о выходе за пределы допустимых интервалов значений.
- Странность в том, что у функции EncodeDate() типы передаваемых данных WORD/unsigned short: [0..65535]; - разница всех переменных даты даёт результат 0. То есть, вроде всё должно быть нормально, однако на деле вылетает ошибка. P.S. -> Может снова что-то криво делаю, либо чего-то недопонимаю =( |
Автор: mrbrooks 14.9.2009, 08:42 | ||
MuForum, к сожалению разность дат в VCL сделана мягко говоря, через одно место. Как было верно замечено разность TTime идет корректно, в отличие от TDate. Поэтому можно немного и подмухлевать.
|
Автор: Anikmar 14.9.2009, 08:50 | ||
Help Билдера:
Если вы вычитаете даты, то в декодированном виде именно такой результат у вас и должен получится. Со временем где-то ошибка: секунд должно быть 2. |
Автор: Anikmar 14.9.2009, 09:08 | ||||
Это про то, что sec должно быть 2 Я не говорил, что это нормальная реализация. Просто она такая. И результат именно тот, который описан в документации. В результате вычитания 2-х дат получается новая дата, в которой целая часть равна 0. Целая часть поля val подразумевает количество дней, прошедших с 30 декабря 1899 года Как вариант из декодированных лет вычесть 1899, из дней 30 и из месяцев 12, но возможны отрицательные значения - их надо обработать как-то. На самом деле задача не совсем тривиальная - при большом диапазоне может накопится погрешность за счет високосных годов. Некоторые другие методы работы со временем и датой считают еще хуже. Для простоты я бы взял такой способ:
Если я ничего не напутал с минусами/плюсами (что-то не тем сейчас голова занята). |
Автор: mrbrooks 14.9.2009, 09:17 | ||
Я же не с претензией ![]() можно. но я бы остановился на своем исходя из условии задачи. ![]() |
Автор: Anikmar 14.9.2009, 09:32 |
Само собой. Я просто думал, что там еще года и месяцы нужны. Если только дни и время то можно и таким способом. |