Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 17
1
RAD 2009-XE3

Сравнение временного интервала(дат) с заданной

24.07.2019, 02:13. Показов 1605. Ответов 10

Author24 — интернет-сервис помощи студентам
Приветствую всех, уважаемые форумчане! Заранее прошу простить, если это где-то уже решено(сам не нашел).
Пишу на билдере 2010(Клиент-Серверное ПО). На форме клиента имеется два DateTimePicker'а, один для стартовой, второй для конечной даты, клиент выбирает интервал и отправляет на сервер. На сервере хранятся файлы отсортированные по папкам с названиями(папок) в формате "ddmmyyyy".
Вопрос: как получить интервал из двух дат переданных от клиента, и проверить каждую папку(дату) на сервере на принадлежность к этому интервалу(желательно максимально просто)
Заранее большая благодарность всем откликнувшимся!)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2019, 02:13
Ответы с готовыми решениями:

Сравнение интервала дат
Появилась задача, есть некоторая таблица reserv со значениями даты "старта" и даты "финиша". И...

Сравнение вычисляемого интервала времени с заданной величиной
Прошу помочь и прощения за свой уровень знаний в области программирования. Считываю время...

Отсчет временного интервала
На прокатном стане объект попадает под первый фотодатчик и начинается отсчет времени, а когда он...

Программирование временного интервала
Привет Всем! Подскажите. Как можно реализовать в аccess , что бы при выборе в комбобоксе например...

10
Модератор
9261 / 6039 / 2379
Регистрация: 21.01.2014
Сообщений: 25,802
Записей в блоге: 3
24.07.2019, 06:37 2
kuton93, как Вы будете общаться с сервером, передавать даты, получать и обрабатывать результат - это дело Ваше, а список папок, принадлежащий интервалу дат можно получить так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <System.DateUtils.hpp>
#include <System.IOUtils.hpp>
...
TDate GetDateFromFileName(String fn)
{
   unsigned short Y = StrToInt(fn.SubString(5, 4));
   unsigned short M = StrToInt(fn.SubString(3, 2));
   unsigned short D = StrToInt(fn.SubString(1, 2));
   return EncodeDate(Y, M, D);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String DirName;
   TStringDynArray A = TDirectory::GetDirectories("C:\\TMP");
   for(int i = 0; i < A.Length; i++)
     {
         Memo1->Lines->Add(A[i]);
         DirName = ExtractFileName(A[i]);
         TDate D = GetDateFromFileName(DirName);
         if(DateInRange(D, DateTimePicker1->Date, DateTimePicker2->Date, true))
           Memo2->Lines->Add(A[i]);
     }
}
Миниатюры
Сравнение временного интервала(дат) с заданной  
2
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 17
24.07.2019, 07:01  [ТС] 3
D1973, спасибо большое, то что нужно молодому растущему программисту!) Через пару часиков опробую Ваш код, отпишусь по результатам!)
0
Модератор
9261 / 6039 / 2379
Регистрация: 21.01.2014
Сообщений: 25,802
Записей в блоге: 3
24.07.2019, 08:19 4
Кстати, что-то вот сейчас подумалось: зачем получать весь список папок и потом его перебирать "вручную", если можно сразу получить только папки, удовлетворяющие условию:
1. В h-файле перед классом формы объявите доп. класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class TDateFilter : public TCppInterfacedObject<TDirectory::TFilterPredicate>
{
    TDate bDate, eDate;
public:
    TDateFilter(TDate d1, TDate d2) : bDate(d1), eDate(d2)
    {
    }
//---------------------------------------------------------------------------
    bool __fastcall Invoke(const String Path, const TSearchRec &SR)
    {
       TDate D = EncodeDate((Word)StrToInt(SR.Name.SubString(5, 4)),
                            (Word)StrToInt(SR.Name.SubString(3, 2)),
                            (Word)StrToInt(SR.Name.SubString(1, 2)));
       return DateInRange(D, bDate, eDate, true);
    }
};
2. Обработчик нажатия кнопки перепишите так:
C++
1
2
3
4
5
6
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TStringDynArray A = TDirectory::GetDirectories("C:\\TMP", new TDateFilter(DateTimePicker1->Date, DateTimePicker2->Date));
   for(int i = 0; i < A.Length; i++)
     Memo2->Lines->Add(A[i]);
}
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от kuton93 Посмотреть сообщение
то что нужно молодому растущему программисту!
Лишь бы у "молодого растущего программиста" было что-то посвежее, чем BCB6...

3
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 17
24.07.2019, 09:58  [ТС] 5
D1973, в первом случае, компилятор ругается на функцию"DateInRange", говорит-не знает такую...

Добавлено через 10 минут
Во-втором случае ошибок ещё больше: на имя класса ругется "Type name expected";
потом дальше по мелочи, скобочки, и неизвестная "DateInRange"
0
Модератор
9261 / 6039 / 2379
Регистрация: 21.01.2014
Сообщений: 25,802
Записей в блоге: 3
24.07.2019, 10:09 6
kuton93, версия-то какая???
Цитата Сообщение от D1973 Посмотреть сообщение
#include <System.DateUtils.hpp>
#include <System.IOUtils.hpp>
А это прописали?
1
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 17
24.07.2019, 10:25  [ТС] 7
D1973, Embarcadero RAD Studio 2010. ОС WIn 7 64bit.
Прописал, но кушает только <DateUtils.hpp> и <IOUtils.hpp>

Добавлено через 38 секунд
Без "System."

Добавлено через 10 минут
D1973, попробовал на билдере 10.2(2018), всё работает. Только вот насколько целесообразно переносить много кода двух программ, ради одной функции?(
0
Модератор
9261 / 6039 / 2379
Регистрация: 21.01.2014
Сообщений: 25,802
Записей в блоге: 3
24.07.2019, 10:29 8
Цитата Сообщение от kuton93 Посмотреть сообщение
RAD Studio 2010
в 2010 - да, еще без System... И да, судя по всему, DateInRange() появилась в модуле DateUtils в 2011 году... Ну, значит, уже и версию 2010 пора в топку...

Добавлено через 2 минуты
Цитата Сообщение от kuton93 Посмотреть сообщение
ради одной функции?
Переносить или нет - дело Ваше, но, уж поверьте, оставаясь на старой версии Вы теряете отнюдь не одну функцию...
1
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 17
24.07.2019, 11:05  [ТС] 9
D1973, я Вас услышал, впредь буду осваивать 10.2. Только вот это ПО пишу уже порядка двух недель, из-за перехода точно придется заморочиться с переназначением библиотек, решать вопрос о переходе от TServer/TClientSocket на что-то другое и это только начало... Мне бы уж всё-таки добить это сравнение интервала хоть через "костыли". Главное чтобы стабильно работало) Может у Вас будут альтернативные мысли, было бы замечательно!)

Добавлено через 28 минут
D1973,
Решил вопрос следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <System.DateUtils.hpp>
#include <System.IOUtils.hpp>
...
TDate GetDateFromFileName(String fn)
{
   unsigned short Y = StrToInt(fn.SubString(5, 4));
   unsigned short M = StrToInt(fn.SubString(3, 2));
   unsigned short D = StrToInt(fn.SubString(1, 2));
   return EncodeDate(Y, M, D);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String DirName;
   TStringDynArray A = TDirectory::GetDirectories("C:\\TMP");
   for(int i = 0; i < A.Length; i++)
     {
         Memo1->Lines->Add(A[i]);
         DirName = ExtractFileName(A[i]);
         TDate D = GetDateFromFileName(DirName);
         if(DateTimePicker1->Date.DateString() <= D){
                    if(DateTimePicker2->Date.DateString() >= D){
                                Memo2->Lines->Add(A[i]);
                   }
         }
     }
}
Большое Вам спасибо!)
0
Модератор
9261 / 6039 / 2379
Регистрация: 21.01.2014
Сообщений: 25,802
Записей в блоге: 3
24.07.2019, 11:18 10
Лучший ответ Сообщение было отмечено kuton93 как решение

Решение

Цитата Сообщение от kuton93 Посмотреть сообщение
хоть через "костыли"
Ну возьмите и напишите свою функцию DateInRange(), после чего используйте вариант из поста 2
C++
1
2
3
4
5
6
7
bool DateInRange(TDate ADate, TDate bDate, TDate eDate, bool Mode)
{
    if(Mode)
      return ((DateOf(ADate) >= bDate) && (DateOf(ADate) <= eDate));
    else
      return ((DateOf(ADate) > bDate) && (DateOf(ADate) < eDate));
}
1
0 / 0 / 0
Регистрация: 25.05.2015
Сообщений: 17
24.07.2019, 16:50  [ТС] 11
D1973, Благодарю, скорее всего реализую с помощью Вашей функции!)
0
24.07.2019, 16:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.07.2019, 16:50
Помогаю со студенческими работами здесь

Расчет временного интервала
Есть две ячейки A1 и A2 в которых задано время в формате xx:xx:xx. В третей ячейки подсчитано...

слайдер для временного интервала
Доброго времени суток, товарищи, подскажите пожалуйста, как можно реализовать слайдер для...

Отсеять из временного интервала время
Добрый день, есть столбец с данными о дате и времени, когда пользователь заходит в систему, из...

SCHED_RR изменение временного интервала
Подскажите пожалуйста. Только начал изучать планирование процессов и sched_setscheduler. Сейчас...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru