Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];




Вниз

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


Delph   (2002-02-27 13:53) [0]

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

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

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



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

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



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

F1.
StrToDate.
ShortDateFormat.



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

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

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



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

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



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

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

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



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

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



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

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



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

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



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

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"



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

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

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

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



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

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

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



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

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



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

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

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;

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



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

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




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.015 c
7-43197           Darker2               2001-10-28 07:54  2002.03.14  
COM Port. Помощь в начинании.


7-43198           Leviathan             2001-12-11 20:47  2002.03.14  
Sleep в консольной программе


6-43130           Валера_               2001-12-27 12:47  2002.03.14  
Ребята! А нет ни у кого готового парсера HTML страницы


1-43034           Mans2k                2002-02-26 14:15  2002.03.14  
Как из Delphi перезать указатель в C++?


3-42947           KPOT                  2002-02-15 12:03  2002.03.14  
Obnovlenije odnoj stroki v DBGrid