![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразование строки разных форматов в дату. [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 не подходит?