Drongo
19-07-2010, 14:55
Приветствую всех. :)
Друзья, понадобилась ваша помощь, самостоятельно решить не могу, вернее, только частично. Пишу парсер логов AVZ. В программу добавил функцию поиска файлов, созданых в определённый промежуток времени - 30 дней с момента создания лога AVZ. В логе AVZ эта строка означает дату сканирования
LogDate="7/17/2010 10:33:29 PM"Переменная DataScan в ней хранится уже извлечённая дата
DataScan = "7/17/2010 10:33:29 PM"В таком же формате времени записаны даты создания файлов.
Переменная AnsiString str хранит передаваемую дату создания файла.
Задача: Как правильно вычесть одну дату из другой?DataScan - strЕсли в логах AVZ формат даты может быть разным:
7/17/2010 10:33:29 PM - Месяц/День/Год - M/D/YYYY
20.03.2010 19:14:48 - День.Месяц.Год - DD.MM.YYYY
19.Jul.2010 19:14:48 - День.Месяц.Год
20.03.2010 19:14:48 - День-Месяц-Год - DD-MM-YYYY
В общем любой формат времени из возможных с любым разделителем. Как из дат различных форматов правильно произвести вычитание?
[hr]
С последним форматом проблем нет, также можно заменить разделитель /, - на точку. Друг помог с форматом 19.Jul.2010 19:14:48
Функция SearchCreateToNMounth принимает два аргумента: 1-й дату, 2-й полное имя файла.
// Поиск файлов созданых в течении 1, 2, 3-х месяцев-------------------------
void __fastcall TForm1::SearchCreateToNMounth(String str, String nf)
{
// Вычисляем диапазон создания файла
TDateTime tmp = StrToDateTime(StrToDateTime(MyDate(DateScan)) - StrToDateTime(MyDate(str)));
if((int)tmp <= 3){
Edit3->Text = String(nf) + " = " + 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;
} //Как только находим его - делаем его разделителем и прерываем цикл (обязательно, иначе конечным символом станет ":", потому что это будет последняя "не цифра")
}
BadDate = StrToDateTime(BadDate); //Теперь приводим к нужному формату записи
return BadDate; //И возвращаем
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Time = "6/17/2010 10:07:11 PM"; //Edit1->Text; 5/17/2010 10:07:11 PM
AnsiString NameFile = "C:\\WinXP\\MyFile.exe";
SearchCreateToNMounth(Time, NameFile);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
DateScan = Edit2->Text; //Edit2->Text; 4/17/2010 10:07:11 PM
}
//---------------------------------------------------------------------------
Ошибку выдаёт такую
http://i077.radikal.ru/1007/71/0197fe3c702c.png
Про операции проводимые с временем читал здесь (http://cppbuilder.ru/articles/0164.php#idaczmxd) и здесь (http://cppbuilder.ru/articles/0174.php)
Что я не так делаю? Если не трудно, подскажите как можно это сделать правильно?
Спасибо.
Друзья, понадобилась ваша помощь, самостоятельно решить не могу, вернее, только частично. Пишу парсер логов AVZ. В программу добавил функцию поиска файлов, созданых в определённый промежуток времени - 30 дней с момента создания лога AVZ. В логе AVZ эта строка означает дату сканирования
LogDate="7/17/2010 10:33:29 PM"Переменная DataScan в ней хранится уже извлечённая дата
DataScan = "7/17/2010 10:33:29 PM"В таком же формате времени записаны даты создания файлов.
Переменная AnsiString str хранит передаваемую дату создания файла.
Задача: Как правильно вычесть одну дату из другой?DataScan - strЕсли в логах AVZ формат даты может быть разным:
7/17/2010 10:33:29 PM - Месяц/День/Год - M/D/YYYY
20.03.2010 19:14:48 - День.Месяц.Год - DD.MM.YYYY
19.Jul.2010 19:14:48 - День.Месяц.Год
20.03.2010 19:14:48 - День-Месяц-Год - DD-MM-YYYY
В общем любой формат времени из возможных с любым разделителем. Как из дат различных форматов правильно произвести вычитание?
[hr]
С последним форматом проблем нет, также можно заменить разделитель /, - на точку. Друг помог с форматом 19.Jul.2010 19:14:48
Функция SearchCreateToNMounth принимает два аргумента: 1-й дату, 2-й полное имя файла.
// Поиск файлов созданых в течении 1, 2, 3-х месяцев-------------------------
void __fastcall TForm1::SearchCreateToNMounth(String str, String nf)
{
// Вычисляем диапазон создания файла
TDateTime tmp = StrToDateTime(StrToDateTime(MyDate(DateScan)) - StrToDateTime(MyDate(str)));
if((int)tmp <= 3){
Edit3->Text = String(nf) + " = " + 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;
} //Как только находим его - делаем его разделителем и прерываем цикл (обязательно, иначе конечным символом станет ":", потому что это будет последняя "не цифра")
}
BadDate = StrToDateTime(BadDate); //Теперь приводим к нужному формату записи
return BadDate; //И возвращаем
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Time = "6/17/2010 10:07:11 PM"; //Edit1->Text; 5/17/2010 10:07:11 PM
AnsiString NameFile = "C:\\WinXP\\MyFile.exe";
SearchCreateToNMounth(Time, NameFile);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
DateScan = Edit2->Text; //Edit2->Text; 4/17/2010 10:07:11 PM
}
//---------------------------------------------------------------------------
Ошибку выдаёт такую
http://i077.radikal.ru/1007/71/0197fe3c702c.png
Про операции проводимые с временем читал здесь (http://cppbuilder.ru/articles/0164.php#idaczmxd) и здесь (http://cppbuilder.ru/articles/0174.php)
Что я не так делаю? Если не трудно, подскажите как можно это сделать правильно?
Спасибо.