Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/48: Рейтинг темы: голосов - 48, средняя оценка - 4.50
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891

Интервал между датами.

13.05.2012, 16:24. Показов 10035. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, надо адекватно посчитать интервал между текущей датой и какой-либо датой в прошлом.

Вот смотрите:

C++
1
Result = Now() - TDate("12.05.2012");
В Result попадает значение: 31.12.99 - нормуль?

Аналогично с функцией DaysBetween:

C++
1
Result = DaysBetween (TDate("12.05.2012"), Now());
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.05.2012, 16:24
Ответы с готовыми решениями:

Интервал между датами
Здравствуйте. Необходимо найти интервал в днях между датами. Знаю про существование функции DaysBetween, но не могу понять к какой...

Как посчитать количество дней между датами
Здравствуйте! Помогите пож. расчитать количество дней между двумя датами, которые вводятся в три поля Edit в формате dd.mm.yyyy. Пишу...

Узнать разницу между двумя датами в месяцах
Привет! Работаю с переменными типа TDateTime: InputDate, StartDate. Хочу узнать разницу в месяцах между InputDate, StartDate. Знаю,...

21
wtf!?
 Аватар для Flyer
750 / 281 / 25
Регистрация: 21.05.2010
Сообщений: 732
13.05.2012, 16:49
Да вроде как нормально работает то
Миниатюры
Интервал между датами.  
0
0 / 0 / 0
Регистрация: 13.05.2012
Сообщений: 4
13.05.2012, 16:57
Цитата Сообщение от Flyer Посмотреть сообщение
Да вроде как нормально работает то
Аналогично.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
14.05.2012, 11:30  [ТС]
Это разница в днях. Она нормально работает, да. А мне интервал нужно выводить в "гг. мм. дд." (прошу прощения, что сразу об этом не сообщил).

Flyer, соответственно для Вашего случая мне на выходе надо иметь: "00 г. 00 мес. 04 дн." Вот...

Добавлено через 20 минут
Все, тупанул. У меня поле Result было TDate, а надо поставить String и туда уже мона разницу в годах, месяцах, днях запихнуть

Спасибо всем!

Добавлено через 17 часов 57 минут
Ребят, чет все-таки не могу сообразить... Получаю разницу в днях между датами, а мне надо ее отразить в полных годах, месяцах и днях.

Подскажите, пожалуйста, как такое можно оформить.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
14.05.2012, 12:58
в месяцах и годах не получиться - они разные от месяца к месяцу и от года к году.

Добавлено через 1 минуту
а вообще DaysBetween, HoursBetween (там даже YearsBetween и MonthsBetween есть но с определенными оговорками)
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
14.05.2012, 12:58  [ТС]
vxg, и учесть это никак нельзя?

Цитата Сообщение от vxg Посмотреть сообщение
а вообще DaysBetween, HoursBetween (там даже YearsBetween и MonthsBetween есть но с определенными оговорками)
Я эти функции и юзаю.
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
14.05.2012, 13:10
ну можн вот так декодировать а потом сравнивать просто:
C++
1
2
3
4
5
6
7
Word Year, Month, Day, Hour, Min, Sec, MSec;
TDateTime dtPresent = Now();
DecodeDate(dtPresent, Year, Month, Day);
DecodeTime(dtPresent, Hour, Min, Sec, MSec);
//а дальше твори что хочешь:
Form1->Memo3->Lines->Add (AnsiString("Сегодня ") + IntToStr(Day) + AnsiString(" день ") + IntToStr(Month) + AnsiString("  месяца ") + IntToStr(Year)+ AnsiString(" года "));
Form1->Memo3->Lines->Add (AnsiString("Сейчас часов ") + IntToStr(Hour) + AnsiString(" минут ") + IntToStr(Min)+ AnsiString(" секунд ") + IntToStr(Sec) + AnsiString(" миллисекунд ") + IntToStr(MSec));
в данном случае можно получить сравнение не ток по датам, но вплоть и до миллисекунд....
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
14.05.2012, 13:41
а, понял, типа между 25 апреля 1999 10 00 и 26 апреля 2000 11 00 расстояние в один год и один день и один час.. тогда как QWIPQ
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
14.05.2012, 16:50  [ТС]
А я вот чего-то, видимо, не понял

Как быть если у нас такой интервал будет браться:

15.06.2010 - 14.05.2012

Декодируем, преобразуем в int дни, месяца, года, а потом начинаем вычитать друг из друга:
14 - 15 = -1
05 - 06 = -1
2012 - 2010 = 2

Как быть?
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
14.05.2012, 17:00
для годов, месяцев, часов - занимаем из предыдущего разряда. а для дней такая штука не подойдет... можно в принципе отсчитывать кол-во дней от даты совпадающей с вычитаемой, но для ситуаций 29/30/31 надо подумать как это будет выглядеть...
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
14.05.2012, 17:46  [ТС]
Вот блин... Гугл молчит и на форуме никто не запаривался... Почему-то =/

Добавлено через 36 минут
Цитата Сообщение от vxg Посмотреть сообщение
для годов, месяцев, часов - занимаем из предыдущего разряда
А примерчик не подскажите, а то до меня чего-то туго доходит все это...
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
14.05.2012, 19:22
Вот блин... Гугл молчит и на форуме никто не запаривался... Почему-то =/
ну эт относительно просто потому что...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    Word Hour, Min, Sec, MSec;      //параметры времени начала
    Word  Hour2, Min2, Sec2, MSec2;  //параметры времени конца
    int resM=0, resS=0, resMS=0;//
//------------------------подсчет времени начала обработки--------------------
    TDateTime dtPresent = Now();
    DecodeTime(dtPresent, Hour, Min, Sec, MSec);
//-----------------------------------------------------------------------------
    Sleep(5000);// просто задержку ввел чтоб посчитать
//------------------------------подсчет времени обработки----------------------
    TDateTime dtPresentS = Now();
    DecodeTime(dtPresentS, Hour2, Min2, Sec2, MSec2);
    resMS=MSec2-MSec;
    resS=Sec2-Sec;
    resM=Min2-Min;
    if (resMS<0){resS--;resMS=resMS+1000;}
    if (resS<0){resM--;resS=resS+60;}
    Form1->Label1->Caption = "функция " + IntToStr(resM) + " минут " + IntToStr(resS) + " секунд и " + IntToStr(resMS) + " миллисекунд(ы) ";
ну вот как-то так
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
14.05.2012, 19:26  [ТС]
QWIPQ, спасибо огромное!
А нельзя попросить аналогичное для years, months and days? Никак не могу допендрить как это сделать...
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
14.05.2012, 19:40
эм... ну ладн:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Word Year, Month, Day;      //параметры времени начала
    Word  Year2, Month2, Day2;  //параметры времени конца
    int resY=0, resM=0, resD=0;//
//------------------------подсчет времени начала обработки--------------------
    TDateTime dtPresent = Now();
    DecodeTime(dtPresent, Year, Month, Day);
//-----------------------------------------------------------------------------
 
//------------------------------подсчет времени обработки----------------------
    TDateTime dtPresentS = Now();
    DecodeTime(dtPresentS, Year2, Month2, Day2);
    resY=Year2-Year;
    resM=Month2-Month;
    resD=Day2-Day;
    if (resM<0){resY--;resM=resM+12;}
    if (resD<0){resM--;resD=resD+30;}//тут будет приблизительный результат
т.к. в разные месяцы разное кол-во дней и берем среднее число 30, тебе над эт момент продумать
в високосном 366 - среднее 30,5
в не високосном 365 - среднее 30,46
1
1 / 1 / 3
Регистрация: 24.03.2010
Сообщений: 50
14.05.2012, 22:49
Ребят, я что-то тоже не совсем разобрался. Есть код.

C++
1
2
3
4
5
TDateTime BackUp,/*дата последнего резервного копирования*/CurrentDate = Date(); // это текущая дата
     DBEdit2->Text=DateToStr(CurrentDate);// на форме вывожу текущую дату
     ShowMessage(DaysBetween(BackUp,CurrentDate));//Использую вашу функцию чтобы найти разницу в числах
     double difference= (double)( CurrentDate - BackUp); //использую другой метод но для той же самой цели
     ShowMessage(difference)//Смотрю что получилось
Возвращаемое значение DaysBetween(BackUp,CurrentDate), и значение переменной difference совпадают. Но они возвращают 41043 по ходу интовское значение. в чём здесь проблема?

Добавлено через 2 минуты
Думал определить переменную BackUp, но что-то с присваиванием не разобрался.
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
14.05.2012, 22:53
Ты лучше скажи чего ты хочешь добить?
0
1 / 1 / 3
Регистрация: 24.03.2010
Сообщений: 50
14.05.2012, 23:04
Цель такая. Хочу создавать резервную копию файла каждые 3 дня. Код выглядит так

C++
1
2
3
4
5
6
7
8
9
10
TDateTime BackUp,/*дата последнего резервного копирования*/CurrentDate = Date(); // это текущая дата
     DBEdit2->Text=DateToStr(CurrentDate);// вывожу сегодняшнюю дату на форму 
     ShowMessage(DaysBetween(BackUp,CurrentDate));//смотрю что возвращает формула
     double difference= (double)( CurrentDate - BackUp); // свой метод определения разницы
     ShowMessage(difference);//смотрю что получилось
     if (difference >3.0 ) {// Читал в теории что возвращается double где 1.0 это один день
     BOOL hFile=CopyFile("..\\DB.mdb",("..\\Backup\\DB_backup_"+DateToStr(CurrentDate)+".mdb").t_str(),true);//собственно говоря само копирование
    if(hFile){ShowMessage("Резервная копия обновлена");//подтверждение копирования
    BackUp=CurrentDate; }//присваивания чтобы не зацикливалось
     }
Функция делается при активации формы.Таки дела
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
15.05.2012, 00:31
вариант №1:
Можно например вот этими функциями узнавать дату и время создания файла во время запуска проги - это на API
C++
1
2
3
4
5
6
7
8
9
10
11
BOOL GetFileTime(
HANDLE hFile,
LPFILETIME lpCreationTime,
LPFILETIME lpLastAccessTime,
LPFILETIME lpLastWriteTime
);
 
BOOL FileTimeToSystemTime(
const FILETIME* lpFileTime,
LPSYSTEMTIME lpSystemTime
);
HANDLE файла узнать вот так например:
C++
1
2
3
4
5
6
7
8
9
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
а дальше плясать уже с получением и декодированием текущей даты, сравнением и копированием

вариант №2:
создать какой-нить txt файл в каталоге с копией того файла который ты сохраняешь и выводить в него дату сохранения файла... после чего из него же брать и сравнивать с текущей датой (но эт не красиво).
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
15.05.2012, 09:20
Цитата Сообщение от QWIPQ Посмотреть сообщение
т.к. в разные месяцы разное кол-во дней и берем среднее число 30, тебе над эт момент продумать
думаю "среднее кол-во дней в месяце" не подойдет. похоже что здесь ситуация-аналог "дня рождения" - то есть считается условное количество месяцев и дней ориентируясь просто на номер даты, например, разность между 15 числа предыдущего месяца и 16 числа текущего должна получиться равной 1 месяц и 1 день вне зависимости от того февраль это или декабрь какой-нибудь.. тогда после того как мы заняли нужно не прибавлять 30, а вычитать из настоящего кол-ва дней в предыдущем месяце разность resD. полученный результат может вызвать у пользователя шок когда он увидит, например, что с установленной даты прошло 1 мес и 30 дней
0
1 / 1 / 3
Регистрация: 24.03.2010
Сообщений: 50
15.05.2012, 14:55
Свою проблему я решил но способом легче ( и в этом случае легче означает хуже) чем предложил
QWIPQ. Хоть неправильно так делать, но я всё же осмелился.Вот моя функция

C++
1
2
3
4
5
6
7
if (CurrentDate>((BackUp.operator --().operator --())).operator --()) {
     BOOL hFile=CopyFile("..\\DB.mdb",("..\\Backup\\DB_backup_"+DateToStr(CurrentDate)+".mdb").t_str(),true);
    if(hFile){ShowMessage("Резервная копия обновлена");
    DeleteFile("..\\Backup\\DB_backup_"+DateToStr(BackUp)+".mdb");
    BackUp=CurrentDate;
    }
     }
Самый наглый ход это условие if (CurrentDate>((BackUp.operator --().operator --())).operator --())

по сути я взял текущую дату CurrentDate присвоил её BackUp, от BackUp трижды декапсулировал его. Для этого перегружены операторы декапсуляции. В общем по идее должно работать, но работоспособность кода я ещё не проверял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2012, 14:55
Помогаю со студенческими работами здесь

Как найти интервал между двумя DateTimePicker ?
Помогите новичку, нужно найти интервал между двумя датами записанными в DateTimePicker1,2. Например есть даты 2017-02-21 14:00:00 и...

Найти разницу между датами
Добрый день, подскажите, как найти разницу во времени между 2я датами tel / dat А / ...

Количество месяцев между двумя датами
Народ всем доброго времени суток. Помогите пожалуйста разобраться. Надо написать запрос для вычисления количества месяцев между двумя...

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

Запрос на вывод данных между определенными датами
Добрый день. Задача такая: вывести данные, у которых дата в BIRTHDATE находится между определенными значениями. пишу так ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru