Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Преобразование строки разных форматов в дату. [D5]


Delph ©   (2002-02-27 13:53:00) 

На входе строка с датой, причем в разных форматах, формат известен. Нет ли функции, которая корректно преобразует строку и вернет переменную TDateTime?
Например:

Stroka := "01.2003";
Format := "mm.yyyy";
d := SampleFunction(Stroka, Format);

Формат м.б. разный. Может кто встречал подобное? Спасибо.


Val   (2002-02-27 16:44:00) [1]

Диапазонами, думаю, удобнее всего, тем более mm.yyyy, разве не диапазон? :) А выбирать удобнее с помощью TDateTimePicker"ов.


Delph   (2002-02-27 16:36:00) [2]

Всем спасибо большое. Я тут сам придумал примерно следующее:

function StringToDate(Stroka, Format: String): TDateTime;
var
D, M, G: String;
i: Integer;
begin
D := "";
M := "";
G := "";
Format := UpperCase(Format);
for i := 1 to Length(Format) do
begin
if Format[i] = "D" then D := D + Stroka[i];
if Format[i] = "M" then M := M + Stroka[i];
if Format[i] = "Y" then G := G + Stroka[i];
end;
if D = "" then D := "1";
if M = "" then M := "1";
if G = "" then G := GetGodNow;
Result := EncodeDate(StrToInt(G), StrToInt(M), StrToInt(D));
end;

function GetGodNow: String;
var
Year, Month, Day: Word;
begin
DecodeDate(Now, Year, Month, Day);
Result := IntToStr(Year);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(DateToStr(StringToDate(Edit1.Text, "mm.yyyy")));
end;

осталось только исключений не допустить :)


Кулюкин Олег   (2002-02-27 16:33:00) [3]

А можно заставить юзера вводить диапазон.
Хочет посмотреть данные за год - пусть выберет диапазон с 1 января по 31 декабря нужного года.
Наверное это будет правильнее всего.


Кулюкин Олег   (2002-02-27 16:28:00) [4]

Я не нашел готовой подходящей функции.
Анализировал вручную.
Форматы:
все распознаваемые функцией StrToDate
+ дата без числа (форматы m.yy, m.yyyy, mm.yy, mm.yyyy)
+ дата без числа и месяца (yy, yyyy)
+ ВСЕ варианты разделителей даты.

Ничего сложного там нет.
Просто протестировать нужно :)


Юрий Зотов   (2002-02-27 16:14:00) [5]

А зачем вообще какие-то форматы?

Если юзер вводит только месяц и год, значит он фактически вводит ДВЕ даты - то есть ДИАПАЗОН от первого до последнего числа этого месяца этого года. Просто подставляете эти числа и формируете две нормальные даты, а дальше обычный select. Аналогично с месяцем и годом.

Другой вариант - хранить день, месяц и год в трех разных полях, тогда вообще все элементарно - select и больше ничего (то есть, если элемент не введен, то в where он не входит).


gek   (2002-02-27 16:08:00) [6]

date_beg:=strtodate(datetostr(date_1)+".01));
date_end:=strtodate(datetostr(date_2)+".31));


select * from table_my where date between "date_beg" and "date_end"


Val   (2002-02-27 16:05:00) [7]

Но вы-то знаете, что вводит пользователь-месяц, год, др.?
А выбрать из базы данные по указанному месяцу, например, не столь сложно - существуют SQL-функции выделения(дня, месяца, года) из даты.


Delph   (2002-02-27 15:48:00) [8]

В том и дело, что пользователю хочется ввести только месяц и год, а выбрать из базы надо все строки по полю типа дата, в которых дата сравнивается с введенным значением. А иногда подразумевается, что все строки одного года, и не надо вводить год... Как я понял, надо самому анализировать строку формата и делать функцию преобразования. Может что посоветуете?


Юрий Зотов   (2002-02-27 15:00:00) [9]

Разве ДАТА может быть без дня?


Delph   (2002-02-27 14:56:00) [10]

Не проходит - исключение :(

procedure TForm1.Button1Click(Sender: TObject);
var
d: TDateTime;
begin
DateSeparator:=".";
ShortDateFormat:="mm.yyyy";
ShowMessage(DateToStr(StrToDate("09.2000")));
end;


DieHard   (2002-02-27 14:44:00) [11]

DateSeparator:=".";
ShortDateFormat:="mm.yyyy";
d:=StrToDate(Stroka);


Delph   (2002-02-27 14:18:00) [12]

Мне надо получить дату, а не строку.
FormatDateTime возвращает строку,

как использовать ShortDateFormat? Можно маленький пример?


Юрий Зотов   (2002-02-27 14:01:00) [13]

F1.
StrToDate.
ShortDateFormat.


fnatali   (2002-02-27 13:59:00) [14]

А FormatDateTime не подходит?


Наверх

Титульная страница Поиск, карта сайта Написать письмо