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

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

13.05.2012, 16:24. Показов 9965. Ответов 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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru