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

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

Не могу сконвертить '01Dec04' в TDate... [D7, WinXP]


GL00m ©   (2005-03-11 00:19:00) 

Пытаюсь сделать StrToDate('01Dec04',fmt), где:
fmt : TFormatSettings;
потом
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT,fmt);
потом
fmt.ShortDateFormat := 'ddmmmyy';
потом даже (сам удивляюсь, как придумал)
fmt.ShortMonthNames[1] := 'Jan';
... до декабря
И все равно не работает!!!
Почему???


begin...end   (2005-03-16 19:35:00) [1]

> Defunct ©   (16.03.05 18:24) [19]

> Чтобы "шариться" по чужему коду много ума не нужно.

Разумеется. И чтобы смотреть в справку - тоже. Но Вы не сделали ни того, ни другого. А просто вякнули на тему, в которой не разбираетесь (и уже не в первый раз). Отсюда вывод - у Вас нет даже этого, небольшого, ума.

> Если ты считаешь, что достаточно начитаться чтобы
> стать умным

Нет, не считаю. Этого недостаточно. Но это - одно из необходимых условий. Видимо, в Вашем случае оно не выполнено. Более того, огорчу Вас: иногда такое даже не лечится.

> это уровень Сальерри

А почитать что-нибудь Вам всё же не мешало бы. Хотя бы для того, чтобы правильно писать на русском языке.

> добро пожаловать в ignorelist

От меня Вы такой милости не дождётесь.


Defunct   (2005-03-16 18:24:00) [2]

Чтобы "шариться" по чужему коду много ума не нужно. Если ты считаешь, что достаточно начитаться чтобы стать умным, то это уровень Сальерри.

И вообще добро пожаловать в ignorelist.


begin...end   (2005-03-16 16:30:00) [3]

> GL00m   (15.03.05 23:09) [17]

> логично было бы предположить, что обратно она
> сработает так же

Возможно. Но - не работает. Поэтому, для того чтобы использовать StrToDate, придётся буквенное обозначение месяца переводить в цифровое.

> Defunct

А что же Вы молчите? Вот уже и автор ветки говорит, что способ, посоветованный Вами, не работает. Вы думаете, он тоже заблуждается?

Defunct, возможно, у Вас хватит ума заглянуть в исходники StrToDate. И тогда Вы, возможно, увидите, что ни в самой StrToDate, ни в подпрограммах, вызываемых ею, даже не встречается идентификатор ShortMonthNames. А если он там не встречается (не используется) - значит, чему бы этот массив в записи TFormatSettings не был равен, результат работы функции StrToDate от этого не изменится. И поэтому StrToDate никогда не поймёт, что такое "Jan", "Dec" и т.д. Хотя, скорее всего, для Вас это всё слишком сложно.

Это ж насколько твердолобым нужно быть, чтобы, несмотря на очевидную неправильность совета, упрямо говорить, что он "проверен" и работает...


GL00m   (2005-03-15 23:09:00) [4]

To Zeqfreed:
Это, конечно, зашибись, но ведь есть стандартная функция и она должна как-то работать! =)))

To Defunct:
У меня так, действительно, тоже не работает - я забыл про это написать.

To begin...end:
Справку я по этому StrToDate скоро до дыр протру...
Там написано: "S must consist of two or three numbers...".
Все понятно. Но если сделать что-то типа DateToStr(GetDate,fmt), где fmt такой же, как и я сделал, то получится именно строка типа "01-Dec-04", логично было бы предположить, что обратно она сработает так же...
Если я был не прав в этом своем суждении, чтож... извиняюсь за разведенный здесь флейм по этому поводу.


begin...end   (2005-03-15 19:52:00) [5]

> Defunct ©   (15.03.05 19:05) [15]

Дык этта... понятно, что Вы написали , что ОНО работает. А ОНО всё же не работает. Причём это тоже "проверено в работе". Поэтому я и попросил Вас привести действительно рабочий код.

И пока Вы его не приведёте - все утверждения относительно его "рабочести" являются голословными.


Defunct   (2005-03-15 19:05:00) [6]

begin...end ©   (15.03.05 18:46) [14]

В [13] и так написано что проверено в работе, или с первого раза не понятно?


begin...end   (2005-03-15 18:46:00) [7]

> Defunct ©   (15.03.05 18:36) [13]

> Прежде чем советовать, я проверил то что советовал в
> работе.

LOL. И как - работает? Интересно было бы посмотреть на код. А то как-то голословно получается.


Defunct   (2005-03-15 18:36:00) [8]

begin...end ©   (15.03.05 15:03) [10]

Любитель справки..
Прежде чем советовать, я проверил то что советовал в работе. А вы коль знакомы с распарсиванием даты только по справке, так лучше б жевали.


Zeqfreed   (2005-03-15 15:56:00) [9]

GL00m   (11.03.05 0:19)
function DecodeXDate(const SDate : String) : TDateTime;
const
Months = 'JanFebMarAprMayJunJulAugSepOctNovDec';
var
y, d : Integer;
m : String[3];

midx : Cardinal;
begin
Result := -1;

if not TryStrToInt(Copy(SDate, 1, 2), d) then Exit;
if not TryStrToInt(Copy(SDate, 6, 2), y) then Exit;
Inc(y, 2000);
m := Copy(SDate, 3, 3);
midx := Pos(m, Months) div 3 + 1;

Result := EncodeDate(y, midx, d);
end;


А так не подойдет? )


begin...end   (2005-03-15 15:04:00) [10]

> begin...end ©   (15.03.05 15:03) [10]

> по DateToStr

по StrToDate


begin...end   (2005-03-15 15:03:00) [11]

> Defunct ©   (11.03.05 01:40) [1]
> Defunct ©   (12.03.05 21:32) [5]
> Defunct ©   (15.03.05 10:27) [9]

Прежде чем советовать, лучше на всякий случай почитать справку. Хотя, если нравится сидеть в луже...

> GL00m   (15.03.05 1:10) [8]

> Но он все равно ругается, что недопустимый, типа,
> формат данных! Почему???

Потому что такой формат данных действительно недопустим. Месяц в строке тоже должен быть строковым представлением числа. См. справку по DateToStr.


Defunct   (2005-03-15 10:27:00) [12]

fmt.ShortDateFormat := ' ddmmmyy';
s := '01-Dec-04';


GL00m   (2005-03-15 01:10:00) [13]

АААААААААААА!!!
Ну вот... Не ожидал. Короче... Все как и прежде, и вставляю я в строку эти "минусики"... Но он все равно ругается, что недопустимый, типа, формат данных! Почему??? Пожалуйста! Не пинайте меня ногами, объясните??? =(((

Напомню:


fmt : TFormatSettings;
tmpdate : TDate;
...
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT,fmt);
fmt.ShortMonthNames[1] := 'Jan';
...
fmt.ShortMonthNames[12] := 'Dec';
fmt.DateSeparator := '-';
fmt.ShortDateFormat := 'dd-mmm-yy';
s := '01-Dec-04';
tmpdate := StrToDate(s,fmt);

На последней-то строчке и ругается...


GL00m   (2005-03-14 23:44:00) [14]

Ну и ладно. Ну и, наверно, вы правы. Спасибо. Не хрен с ним мучиться, не достойно оно того... =)))
Всем спасибо.
з.ы. Если вдруг кто узнает, как же это все-таки делается без модификации строки, черкните на мыло, плз?.. =))


SergP   (2005-03-13 13:48:00) [15]


>  [4] GL00m   (12.03.05 12:56)


Добавь эти символы и не мучайся. Тем более если номер дня, название месяца и номер года состоят из фиксированого числа символов, то добавить минусы вообще просто:

Insert('-',s,6);
Insert('-',s,3);


Defunct   (2005-03-12 21:32:00) [16]

Неужели нельзя добавить два символа "-" до букв и после?


GL00m   (2005-03-12 12:56:00) [17]

Так вся беда в том, что не я пишу этот файл... Неужели нельзя такой очевидный формат даты как-нить автоматизировано перевести в TDate?.. =((( Я, конечно, понимаю, что и самому функцию такую несложно написать, но это уже крайний случай... Я пытался в этом fmt DateSeparator задавать просто '', но так, естественно не работает...


Silla   (2005-03-11 10:54:00) [18]

Может лучше в данный файл записывать дату с разделителем?


GL00m   (2005-03-11 08:08:00) [19]

Да... Это может быть... Но дело в том, что я эту строчку с датой читаю из файла. И мне тогда придется ее переделывать... А можно как-нибудь без разделителя?


Defunct   (2005-03-11 01:40:00) [20]

ожидается разделитель.
попробуйте так:

fmt.DateSeparator := '-';
fmt.ShortDateFormat := 'ddmmmyy';
StrToDate('01-Dec-04', fmt);


Наверх

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