Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.14;
Скачать: CL | DM;

Вниз

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

 
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"ов.



Страницы: 1 вся ветка

Текущий архив: 2002.03.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
6-43131
ThaDrot
2001-12-24 18:42
2002.03.14
TCP-IP Info ?


6-43126
ken
2001-12-26 16:24
2002.03.14
как написать прогу для переадресации сетевых потоков TCP/IP?


1-43091
Demon ltd
2002-02-27 23:42
2002.03.14
Повторная помощь с созданием инстольника


7-43194
Mastadon
2001-12-10 15:07
2002.03.14
Надежда умирает последней !!! Насчет декомпиляции dcu в pas


1-43059
vrRaven
2002-02-24 05:46
2002.03.14
Форма вместо вложенного меню