C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Конвертер дат
Игорюха
Отправлено: 21.03.2007, 15:00


Ученик-кочегар

Группа: Участник
Сообщений: 13



Приходят файлы, в фалах указаны даты, единого стандарта нет, поэтому они пишут что попало, могут так написать 1999-01-01, могут так 01011999, еще так 01.01.99, вообщем примеров много. Вопрос такой есть такая функция которая имеет может может преобразовать к какому то определенному формату, если есть то подскажите, или придется анализировать строку?
Admin
Отправлено: 21.03.2007, 16:23


Владимир

Группа: Администратор
Сообщений: 1190



придется анализировать строку
Игорюха
Отправлено: 21.03.2007, 17:27


Ученик-кочегар

Группа: Участник
Сообщений: 13



мда...
А как проверить на корректность дату.
Есть строка например:"01.02.2006" как проверить корректна ли дата?
Guest
Отправлено: 21.03.2007, 17:30


Не зарегистрирован







Встречный вопрос — а как вы определите это первое февраля или второе января? А если еще год задан двумя цифрами. biggrin.gif
Игорюха
Отправлено: 21.03.2007, 17:35


Ученик-кочегар

Группа: Участник
Сообщений: 13



ну вообщем там месяц всегда второй в списке, а год если стоит 1 то всегда пишут 4 цифры, а если выражени типа: "01/02/03" то год брать последним, т.е. год = 2003
Игорюха
Отправлено: 21.03.2007, 17:37


Ученик-кочегар

Группа: Участник
Сообщений: 13



А про проверку коректности даты мне кто-нибудь скажет полезное? victory.gif
Guest
Отправлено: 21.03.2007, 18:21


Не зарегистрирован







QUOTE

А про проверку коректности даты мне кто-нибудь скажет полезное?

Легко. smile.gif
Разбиваете строку на группы цифр.
Определяетесь какая из групп за что отвечает (число, месяц, год).
Анализируете
- год подходит?
- месяц в диапазоне [1 — 12]?
- число>= 1 и не больше числа дней в этом месяце этого года?
Проверки можно возложить на конструктор TDateTime

Информация к размышлению:
А ведь пользователи могут еще вводить месяц и буковками cool.gif
Ramzay
Отправлено: 22.03.2007, 10:16


Дежурный стрелочник

Группа: Участник
Сообщений: 31



Есть еще вариант. Допустим ты получил дату в виде строки DateStr. DateStr может быть в разных форматах:
CODE

AnsiString Format1= "dd.mm.yy"
AnsiString Format2= "dd-mm- yy"
AnsiString Format3= "dd-mm-yyyy"
. . .

Дальше пробуем поочередно перекодировать дату DateStr в соответствии со списком форматов:
CODE

TDateTime MyDate=NULL;
ShortDateFormat=Format1;
try
{
StrToDate(DateStr); // пробуем перекодировать
}
catch(...) // если перекодирвать не удалось, ошибки не будет
{;}
if(MyDate) // если перекодировать удалось, выходим
return MyDate;

ShortDateFormat=Format2;try { StrToDate(DateStr);}catch(...) {;} if(MyDate) return MyDate;
ShortDateFormat=Format3;try { StrToDate(DateStr);}catch(...) {;} if(MyDate) return MyDate;
. . .

Moжно организовать массив, список, цикл, загрузку списка форматов из файла и т.д. Это уже нужно смотреть по месту.

Отредактировано Ramzay — 22.03.2007, 10:17

Вернуться в Вопросы программирования в C++Builder