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

арифметика со временем

08.04.2010, 22:51. Показов 7170. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста, мне нужно написать программу в которой есть 3 типа времени:
1 - время приезда
2 - время в пути
3 - время выезда
чтобы было проще понять что мне нужно 3=1-2
я пробовал сравнивать данные из Edit'ов но ничего толкового не вышло...

заранее благодарен
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2010, 22:51
Ответы с готовыми решениями:

Арифметика с датой и временем
Подскажите плс. как мне в отчете отнять от имеющегося времени 5 минут

Как получить разницу между текущем временем и временем создания файла?
Пробую так #include <time.h> time_t timer; time(&timer); тут timer = 1418974297 милисекунд...

Вычислить промежуток времени между текущей датой/временем и временем, введенным пользователем
Создайте новое приложение. Пакет приложения назовите com.ВАШЕ_ИМьЯ.time_span. Функционал...

Определить интервал между текущим временем и временем до звонка
Написать программку отсчитывающую время от текущего времени до конца урока

37
0 / 0 / 0
Регистрация: 08.04.2010
Сообщений: 13
20.06.2010, 16:29  [ТС] 21
Author24 — интернет-сервис помощи студентам
в общем если считать так в июне 30 дней, если прибавить к 20.06.2010 1 месяц в 30 дней то оно и покажет 20.07.2010, а если считать с июля в котором 31 день - то оно выдаст не 20.08.2010, а 19.08.2010, если бы во всех месяцах было по 30 дней - небыло бы и проблем, а так получается +/- в 1-3 дня...
0
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
20.07.2010, 13:02 22
Привет друзья. Поднимаю тему. Ребят, без вашей помощи ничего не получается. Мне нужно произвести вычитание одной даты из другой, не зная заранее формата даты и получая только дату из текстового лога. К примеру в логе есть такая строка(это дата сканирования системы и создания лога - это контрольное значение, из неё мы вычитаем дату создания файлов. Формат даты файлов аналогичен формату даты создания лога. DateScan хранит дату из LogDate)
Код
LogDate="7/17/2010 10:33:29 PM"
Различные форматы
Код
23.Oct.2008 21:35:48
23-Oct-2008 21:35:48
23/Oct/2008 21:35:48
23.Окт.2008 21:35:48 - с различными разделителями, вообще разделители не вопрос, можно StringReplace заменять на точку
26.12.2008 19:39:20
26-12-2008 19:39:20
26/12/2008 19:39:20
4/14/2008 5:42:20 AM - Здесь идёт первым месяц\дата\год
В функцию передаётся строка даты, например 4/14/2008 5:42:20 AM и имя файла. На выходе должна получиться разница между вычитаемыми датами и если разница меньше 30 (1 месяца) вывести имя этого файла. Друг помог реализовать для форматов вида 23/Oct/2008 21:35:48, а вот с этим форматом, у меня тупик выдаёт ошибку
Код
4/14/2008 5:42:20 AM - Здесь идёт первым месяц\дата\год
Название: 0197fe3c702c.png
Просмотров: 50

Размер: 8.0 Кб

Используемы код ниже
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
28
29
30
// Поиск файлов созданых в течении 1, 2, 3-х месяцев-------------------------
void __fastcall TForm1::SearchCreateToNMounth(String date, String namefile)
{
   // Вычисляем диапазон создания файла
   TDateTime tmp = StrToDateTime(StrToDateTime(MyDate(DateScan)) - StrToDateTime(MyDate(date)));
 
   if((int)tmp <= 30){
      Edit3->Text = String(namefile) + " = " + DateScan;
     }                     
}
// BadDate - это дата, которую нужно проверить на "правильность" записи. Допустим, "3-Окт-17 23:22:21"
AnsiString __fastcall TForm1::MyDate(String BadDate)
{
   String MonthRUS[13]={"", "Янв", "Фвр", "Мрт", "Апр", "Май", "Июн", "Июл", "Агс", "Снт", "Окт", "Нбр", "Дкб"};
   String MonthENG[13]={"", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
 
   for(int i = 1; i <= 12; i++){
      BadDate = StringReplace(BadDate, MonthENG[i], i, TReplaceFlags()<<rfReplaceAll);  //Здесь мы заменяем название месяца на его порядковый номер
      BadDate = StringReplace(BadDate, MonthRUS[i], i, TReplaceFlags()<<rfReplaceAll);  //Здесь мы заменяем название месяца на его порядковый номер
     }
   ShortDateFormat = "dd.mm.yyyy";  //Устанавливаем вид "правильной" даты
   for(int i = 1; i < BadDate.Length(); i++){  //Вот здесь мы начинаем проходить циклом по всей записи
      if(!(BadDate[i] >= '0' && BadDate[i] <= '9')){   // И ищем тот символ, который не является цифрой
         DateSeparator = BadDate[i];
         break;
        }   //Как только находим его - делаем его разделителем и прерываем цикл (обязательно, иначе конечным символом станет ":", потому что это будет последняя "не цифра")
   }
   return BadDate; //И возвращаем
}
//---------------------------------------------------------------------------
Вопрос заключается в том, как произвести вычитания из дат различных форматов дат с различными разделителями? Чтобы в функция могла принять строку в любом существующем формате даты и произвести вычетание.

Спасибо.
0
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
20.07.2010, 16:08 23
Цитата Сообщение от Maestro Посмотреть сообщение
как произвести вычитания из дат различных форматов дат с различными разделителями?
Ну для этого нужно привести к общему виду. У Вас конечное число форматов? Т.е. только такие, как в примере лога?
Если так, то задача немного упрощается, т.к. у Вас используются всего два формата
1) dd(разделитель)mm(разделитель)yyyy
и
2) mm(разделитель)dd(разделитель)yyyy
Остается только определить к какому формату (к 1 или 2) относиться запись.
Как видно из лога американский формат имеет на конце приписку в виде AM или PM (4/14/2008 5:42:20 AM). Если это верно для всех записей в американском формате, то задача упрощается еще сильнее
Далее, после того как определен формат, запись нужно привести к какому-либо стандартному виду (т.е. заменить разделители на нужные или вообще их убрать).
Ну а когда даты приведены к одному общему виду, то уже можно с ними делать что угодно.
Например, запись даты можно представить в виде 20100720. Тогда простой математической операцией (а именно вычитанием), можно определить прошел месяц или нет. Т.е. 20100720-20100620=100.
Если ответ равен 100, то прошел месяц, если меньше 100 то месяц еще не прошел.
1
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
20.07.2010, 16:39 24
У Вас конечное число форматов? Т.е. только такие, как в примере лога?
Нет, это не конечное число, теоретически могут быть все доступные форматы, которые пользователь посчитает выбрать в региональных настройках.
Как видно из лога американский формат имеет на конце приписку в виде AM или PM (4/14/2008 5:42:20 AM).
Такой гарантии нет например, на своей виртуалке, я ради опыта поставил формат M.D.YYYY HH:MM:SS и тут уже получается первая половина формата попадает под условие. И при таком - 7.11.2010 23:12:10 - Как различить что это именно 11 Июля 2010 года, а не 7 Ноября 2010 года?

В идеале, мне время даже не нужно, нужна только дата.

Ну а когда даты приведены к одному общему виду, то уже можно с ними делать что угодно.
Например, запись даты можно представить в виде 20100720. Тогда простой математической операцией (а именно вычитанием), можно определить прошел месяц или нет. Т.е. 20100720-20100620=100.
Если ответ равен 100, то прошел месяц, если меньше 100 то месяц еще не прошел.
Сами даты в логе имеют единый формат, тот, на каком компьютере они были сделаны. Вот если бы дату можно было перевести в секунды, без разницы, в каком формате эта дата записана, тогда можно было бы и вычислением легко разруливать разницу. Но я не знаю, как это сделать, потому и прошу помощи.
0
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
20.07.2010, 16:54 25
Цитата Сообщение от Maestro Посмотреть сообщение
И при таком - 7.11.2010 23:12:10 - Как различить что это именно 11 Июля 2010 года, а не 7 Ноября 2010 года
Для таких случаев функции, которая занимается конвертацией даты, нужно передавать еще и параметр, который бы сказал ей, в каком формате эта дата. Вот в этом вся и сложность...
А в логе даты как идут? по порядку независимо от формата?
1
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
20.07.2010, 17:18 26
А в логе даты как идут? по порядку независимо от формата?
Вопроса не совсем понял. Отвечаю как понял. Одна строка одна единица информации включая имя файла, дату создания файла, дату изменения, MD5 и ещё много всего прочего. Вот фрагмент такого лога. Нужная нам дата записана CreateDate в этом значении.
Код
<ITEM PID="2816" File="c:\windows\system32\alg.exe" CheckResult="0" Descr="Application Layer Gateway Service" LegalCopyright="© Microsoft Corporation. All rights reserved." Hidden="0" CmdLine="C:\WINDOWS\System32\alg.exe" Size="44544" Attr="rsAh" CreateDate="4/14/2008 5:42:14 AM" ChageDate="4/14/2008 5:42:14 AM" MD5="8C515081584A38AA007909CD02020B3D" /> 
<ITEM PID="1200" File="c:\program files\alwil software\avast5\avastsvc.exe" CheckResult="0" Descr="avast! Service" LegalCopyright="Copyright (c) 2010 AVAST Software" Hidden="0" CmdLine="@quot;C:\Program Files\Alwil Software\Avast5\AvastSvc.exe@quot;" Size="40384" Attr="rsAh" CreateDate="4/29/2010 11:49:05 AM" ChageDate="6/28/2010 11:57:15 PM" MD5="B2386A8E66891F7CFEC9F5A03F0F1210" /> 
<ITEM PID="1608" File="c:\progra~1\alwils~1\avast5\avastui.exe" CheckResult="0" Descr="avast! Antivirus" LegalCopyright="Copyright (c) 2010 AVAST Software" Hidden="0" CmdLine="@quot;C:\PROGRA~1\ALWILS~1\Avast5\avastUI.exe@quot; /nogui" Size="2837864" Attr="rsAh" CreateDate="4/29/2010 11:49:05 AM" ChageDate="6/28/2010 11:57:18 PM" MD5="38AE7A942FC3FAB1C6A27EB65DE8F827" /> 
...
...
И так далее...
0
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
21.07.2010, 08:41 27
Цитата Сообщение от Maestro Посмотреть сообщение
Вопроса не совсем понял.
Имелось ввиду даты в логе записаны в хронологическом порядке?

А вот как вы сами находите ответ на такой вопрос:
Цитата Сообщение от Maestro Посмотреть сообщение
И при таком - 7.11.2010 23:12:10 - Как различить что это именно 11 Июля 2010 года, а не 7 Ноября 2010 года?
По-моему ответить на такой вопрос можно, только анализируя предыдущие и следующие даты в логе. Думаю, что анализируя с десяток записей до и с десяток после можно таки сделать вывод в каком формате записана дата, конечно при условии, что даты записаны в хронологическом порядке (но все равно существует вероятность ошибки ).
Т.е. примерно так:
дата N должна быть больше даты N-1, дата N-1 больше даты N-2, и т.д.
дата N должна быть меньше даты N+1, дата N+1 меньше даты N+2, и т.д.
1
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
21.07.2010, 12:28 28
Имелось ввиду даты в логе записаны в хронологическом порядке?
Нет, даты могут быть записаны в беспорядочном порядке. Например может быть идти даты 2010 года, а следом 2009 или 2008
А вот как вы сами находите ответ на такой вопрос:
Мысль банальная, проверять первые два числа, если любое из чисел больше 12, то в той позиции месяц. Или та позиция числа которой чаще всего меняет значение - то день.

Но эти проверки увеличат время обработки в программе в несколько раз.

Печально. Узнал что ещё существует японский формат времени, когда год впереди.
Для таких случаев функции, которая занимается конвертацией даты, нужно передавать еще и параметр, который бы сказал ей, в каком формате эта дата.
Можешь написать действительный пример этой функции? Я думаю, может добавить дополнительное редактируемое поле\список с выбором различных форматов?

Попробую подрезюмировать. Есть форматы:

1. Стандартный - День\Месяц\Год
2. Американский - Месяц\День\Год
3. Японский - Год\День\Месяц или Год\Месяц\День
0
Покинул форум
3187 / 1366 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
21.07.2010, 12:42 29
Maestro, определять что идет первым очень сложно:
08.10.07 23:14:13
Как в такой записи определить что за чем идет? Может если бы как-то узнавать формат на компьтере, на котором эта запись была сделана, тогда шанс бы был. Логи, как я понимаю, делает другая программа?
0
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
21.07.2010, 13:09 30
Цитата Сообщение от Nitan Посмотреть сообщение
Может если бы как-то узнавать формат на компьтере, на котором эта запись была сделана
Полностью поддерживаю Maestro Вы имеете возможность как-то влиять на то, кто и что пишет в лог?
Цитата Сообщение от Maestro Посмотреть сообщение
Я думаю, может добавить дополнительное редактируемое поле\список с выбором различных форматов?
А куда Вы хотите добавить это поле? В свою программу которая обрабатывает логи? Не вижу смысла, т.к. допустим выбран европейский формат времени, а в логе попался американский, то вы получите
is not a valid date and time.
0
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
21.07.2010, 13:25 31
Логи, как я понимаю, делает другая программа?
Полностью поддерживаю Maestro Вы имеете возможность как-то влиять на то, кто и что пишет в лог?
В том-то всё и дело что другая программа делает эти логи. Нет, логи делаются по рекомендации хелперов, типа, скачайте такую-то утилиту, сделайте ей лог на своём компьютере - прикрепите к следующему сообщению. Точки соприкосновения с конечным пользователем\компьютером, только посредством этого лога.

А куда Вы хотите добавить это поле? В свою программу которая обрабатывает логи? Не вижу смысла, т.к. допустим выбран европейский формат времени, а в логе попался американский, то вы получите
Да, но тогда я могу написать правильный формат - американский
0
Покинул форум
3187 / 1366 / 109
Регистрация: 29.01.2010
Сообщений: 2,887
21.07.2010, 13:41 32
Maestro, значит, разница в порядке записи даты бывает только 3 видов: Американская, Европейская, Японская. В самом логе это как-то отобразится?
0
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
21.07.2010, 14:02 33
Цитата Сообщение от Nitan Посмотреть сообщение
В самом логе это как-то отобразится?
Дата запишется в соответствующем формате. Если честно вопроса не понял. Как это должно отображаться?
0
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
21.07.2010, 14:08 34
Цитата Сообщение от Maestro Посмотреть сообщение
Нет, логи делаются по рекомендации хелперов, типа, скачайте такую-то утилиту, сделайте ей лог на своём компьютере - прикрепите к следующему сообщению
Т.е. в одном логе может быть только один формат даты\времени? Так??? В том формате который определен на компьютере пользователя, который и делал лог. Правильно я понял?
Тогда конечно делайте комбобоксик с выбором формата в своей программке, которая и анализирует лог. А там уж под это дело и функцию можно написать
0
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
21.07.2010, 14:12 35
в одном логе может быть только один формат даты\времени? Так???
Да, один лог - все записи в одном формате времени.

Тогда конечно делайте комбобоксик с выбором формата в своей программке, которая и анализирует лог. А там уж под это дело и функцию можно написать
Это и имелось ввиду. Но как написать функцию эту, я не знаю.
0
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
21.07.2010, 14:26 36
Цитата Сообщение от Maestro Посмотреть сообщение
Но как написать функцию эту, я не знаю.
У меня на работе билдера нету, т.ч. как домой приеду помогу чем смогу
1
55 / 55 / 5
Регистрация: 09.03.2009
Сообщений: 177
21.07.2010, 20:16 37
Так, ну как и обещал. Вот написал небольшую программулину, в качестве примера самое оно:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
ShortDateFormat = "dd.mm.yyyy";
DateSeparator = '.';
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
 ShortDateFormat = ComboBox1->Text;
 switch(ComboBox1->ItemIndex)
 {
        case 0:
        case 1:
        case 2:
                DateSeparator = '.';
                break;
        case 3:
        case 4:
        case 5:
                DateSeparator = '/';
                break;
        case 6:
        case 7:
        case 8:
                DateSeparator = '-';
                break;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if ((Edit1->Text=="")||(Edit2->Text=="")) return;
TDateTime dt1, dt2;
dt1 = StrToDate(Edit1->Text);
dt2 = StrToDate(Edit2->Text);
Edit3->Text = IntToStr(CntDay(dt1, dt2));
}
//---------------------------------------------------------------------------
int TForm1::CntDay(TDateTime dt1, TDateTime dt2)
{
if (dt1==dt2) return 0;
if (dt1>dt2) return (dt1-dt2).operator int();
else return (dt2-dt1).operator int();
}
//---------------------------------------------------------------------------
Сам проект во вложении
Вложения
Тип файла: rar Date.rar (360.4 Кб, 16 просмотров)
2
Маэстро
Вирусоборец
1244 / 365 / 40
Регистрация: 06.09.2009
Сообщений: 798
23.07.2010, 17:39 38
Cepera, Благодарю.
0
23.07.2010, 17:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2010, 17:39
Помогаю со студенческими работами здесь

Работа со временем
Есть класс &quot;Часы&quot;, у него есть статический член - &quot;часовой пояс&quot;. Задание: перевести все часы -...

Работа с временем
Здравствуйте, нужно на сайте сделать лимит отправки сообщений 3 раза в день только будет можно. Как...

Работа с временем
Привет всем,подскажите как создать переменную со значением типа Время ДФ=&quot;HH:mm&quot; ? Добавлено...

Работа со временем
Добрый день. Есть два промежутка времени. Начальное и конечное. С помощью цикла do .. while...


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

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