Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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"ов.



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

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

Наверх





Память: 0.47 MB
Время: 0.004 c
14-43157
Inkognito
2002-01-28 15:28
2002.03.14
Непрограммист в программиста


1-43104
greenrul
2002-02-27 18:44
2002.03.14
Как обработать событие закрытия программы?


7-43189
Alexander Beliy
2001-12-07 23:07
2002.03.14
CPU, Memory, Modem (ОЧЕНЬ СРОЧНО !!!)


1-43033
makar
2002-02-26 09:25
2002.03.14
Вопрос


7-43208
Alexander Beliy
2001-12-10 14:18
2002.03.14
Вопрос про модем





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский