![]() |
|
![]() ![]() ![]() |
|
MuForum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 427 Регистрация: 13.6.2007 Где: Молдова, Кишинев Репутация: 1 Всего: 4 |
Доброе время суток.
Работаю на "Borland C++ Builder 2009". # Задача: Сравнить два объекта TDateTime и вернуть результат разницы дней, часов, минут и секунд в строке. - Возвращаемый результат: XX days HH:mm:ss; (01 days 12:03:15) - Я решил эту задачу, однако реализация мне не очень нравится.
P.S. -> Если кто-то может предложить лучший способ вычисления, буду рад. Это сообщение отредактировал(а) MuForum - 13.9.2009, 17:04 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли) |
|||
|
||||
Efs |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 31.8.2009 Репутация: нет Всего: нет |
Хм.. а почему бы не оперировать с типами TDateTime, встроенными в BCPP, а не со строками ?
|
|||
|
||||
smoke_man |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 25.1.2007 Где: Рязань Репутация: 9 Всего: 17 |
Например, так:
-------------------- 0x2b|~0x2b |
|||
|
||||
MuForum |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 427 Регистрация: 13.6.2007 Где: Молдова, Кишинев Репутация: 1 Всего: 4 |
Данный способ хорош, НО, он не правильно определяет дату. (год, месяц, день) -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли) |
||||
|
|||||
Efs |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 31.8.2009 Репутация: нет Всего: нет |
Есть одна хорошая штука в билдере - DateTimePicker. С него можно брать заданную дату и время:
Получив дату и время таким образом, можно выполнять сравнение. Другое дело, если вы будете брать данные из файлов. |
|||
|
||||
MuForum |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 427 Регистрация: 13.6.2007 Где: Молдова, Кишинев Репутация: 1 Всего: 4 |
Вы не поняли задачу. С получением даты и времени проблем не возникает. Проблема возникает с вычитанием двух TDateTime -> Результат времени корректен, а вот результат даты нет.
- Я тоже так сделал в первый раз, но из-за не корректного результата даты отказался. - Может я что-то не так делаю, подскажите. P.S. -> Ещё раз уточняю задание. Есть два объекта TDateTime, мне необходимо получить их разность. Добавлено @ 08:03 Кстати, пробовал и в ручную получить разницу даты и записать в класс TDateTime, однако выдаёт ошибку о выходе за пределы допустимых интервалов значений.
- Странность в том, что у функции EncodeDate() типы передаваемых данных WORD/unsigned short: [0..65535]; - разница всех переменных даты даёт результат 0. То есть, вроде всё должно быть нормально, однако на деле вылетает ошибка. P.S. -> Может снова что-то криво делаю, либо чего-то недопонимаю =( Это сообщение отредактировал(а) MuForum - 14.9.2009, 08:11 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли) |
||||||||
|
|||||||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
MuForum, к сожалению разность дат в VCL сделана мягко говоря, через одно место. Как было верно замечено разность TTime идет корректно, в отличие от TDate. Поэтому можно немного и подмухлевать.
Это сообщение отредактировал(а) mrbrooks - 14.9.2009, 08:45 |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Help Билдера:
Если вы вычитаете даты, то в декодированном виде именно такой результат у вас и должен получится. Со временем где-то ошибка: секунд должно быть 2. |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
||||
|
||||
Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Это про то, что sec должно быть 2 Я не говорил, что это нормальная реализация. Просто она такая. И результат именно тот, который описан в документации. В результате вычитания 2-х дат получается новая дата, в которой целая часть равна 0. Целая часть поля val подразумевает количество дней, прошедших с 30 декабря 1899 года Как вариант из декодированных лет вычесть 1899, из дней 30 и из месяцев 12, но возможны отрицательные значения - их надо обработать как-то. На самом деле задача не совсем тривиальная - при большом диапазоне может накопится погрешность за счет високосных годов. Некоторые другие методы работы со временем и датой считают еще хуже. Для простоты я бы взял такой способ:
Если я ничего не напутал с минусами/плюсами (что-то не тем сейчас голова занята). |
||||
|
|||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
||||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |