Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];

Вниз

String to Date   Найти похожие ветки 

 
Grihan   (2006-05-05 20:07) [0]

Здравствуйте.

Подскажите пожалуйста, как конвертнуть строчку "10.10.2005 г." (дата в Болгарской локале) в TDateTime?

Спасибо.


 
Лшдлуттнсфе   (2006-05-05 20:29) [1]

StrToDateTime


 
Мефисто   (2006-05-05 20:42) [2]

DecodeDate()
StrToDate()

+ F1 or DateUtils.pas


 
Grihan   (2006-05-05 20:57) [3]

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

P.S. вопрос задан вполне конкретно: есть строка "10.10.2005 г.". Требуется преобразовать ее в дату, типа TDateTime.


 
Grihan   (2006-05-05 21:03) [4]

Подчеркну сразу, что советы, по поводу удаления 3-х последних символов или аналогичные им (например: найти букву "г" и уталить все, что после нее) слишком очевидны, а потому неприемлимы.


 
Лшдлуттнсфе   (2006-05-05 21:07) [5]


> 3] Grihan   (05.05.06 20:57)


Вы сами пробовали справку читать? Не установлена? Лень? Не найти клавишу Ф1? Или еще какая-проблема?

Не беспокойтесь!
Я напечатаю продвинутым методом копи-пасте специально для Вас!

function StrToDate(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload;

Description

S must consist of two or three numbers, separated by the character defined by the DateSeparator global variable or its TFormatSettings equivalent. The order for month, day, and year is determined by the ShortDateFormat global variable or its TFormatSettings equivalent--possible combinations are m/d/y, d/m/y, and y/m/d.

If S contains only two numbers, it is interpreted as a date (m/d or d/m) in the current year.

Year values between 0 and 99 are converted using the TwoDigitYearCenturyWindow. This value is stored either in a global variable (first form) or as a field in the FormatSettings parameter (second form) See "Currency and Date-Time Formatting Variables" for more information.

The first form of StrToDate is not thread-safe, because it uses localization information contained in global variables. The second form of StrToDate, which is thread-safe, refers to localization information contained in the FormatSettings parameter. Before calling the thread-safe form of StrToDate, you must populate FormatSettings with localization information. To populate FormatSettings with a set of default locale values, call GetLocaleFormatSettings.

Успехов.


 
KilkennyCat ©   (2006-05-05 21:11) [6]


> Подчеркну сразу, что советы, по поводу удаления 3-х последних
> символов или аналогичные им (например: найти букву "г" и
> уталить все, что после нее) слишком очевидны, а потому неприемлимы.


TTBOMK


 
Grihan   (2006-05-05 21:35) [7]

:)
Вы упорно не хотите тестировать свои же советы :)
Может попробуете все таки?
Я воспользуюсь Вашим методом Copy/Paste, чтобы Вас не утруждать.
StrToDate(DateToStr(Date));
Единственное, что я не смогу сделать - так это выставить Болгарскую локале у Вас на машине. Попробуйте.

PS может  другие какие функции знаете? :) API-шные например (но чтоб работали :) )? я знаю точно, что в .NET таких проблем нет


 
Grihan   (2006-05-05 21:43) [8]

Я так понял, что Лшдлуттнсфе = KilkennyCat
но не понял, что такое TTBOMK

P.S. Действительно, Вы очень интересный :)


 
Мефисто   (2006-05-05 21:50) [9]

Grihan    (05.05.06 21:43) [8]

Для уснувших за клавиатурой :)

Повторяю пост

Лшдлуттнсфе    (05.05.06 21:07) [5]

function StrToDate(const S: string; const FormatSettings: TFormatSettings): TDateTime; overload;

TFormatSettings + F1 + SysUtils.Pas + DateUtils.pas + кучуинтересного узнаете


 
Leonid Troyanovsky ©   (2006-05-05 22:04) [10]


> Grihan   (05.05.06 20:07)  

> Подскажите пожалуйста, как конвертнуть строчку "10.10.2005
> г." (дата в Болгарской локале) в TDateTime?


А можно полюбопытствовать, как в оной локали выглядит
ShortDateFormat, или, скажем, LOCALE_SSHORTDATE?

--
Regards, LVT.


 
Grihan   (2006-05-05 22:04) [11]

нет, так не пойдет.
Вы пожалуйста ответьте не следующие вопросы:
1) пробовали ли Вы сами?
2) Вы издеваетесь?
3) Как конвертнуть строчку "10.10.2005 г." (дата в Болгарской локале) в TDateTime?


 
MBo ©   (2006-05-05 22:05) [12]

Как можно убедиться в исходниках, ничего чудесного функции вроде StrToDate не делают, а просто разбирают входную строку.
Ничего не мешает сделать это самостоятельно - по крайней мере, отрезать г., и ничего неприемлемого тут нет, а остаток прекрасно переведется StrToDate (c установкой ShortDateFormat, если на разных машинах он меняется)


 
Grihan   (2006-05-05 22:06) [13]

Leonid Troyanovsky wrote:

> А можно полюбопытствовать, как в оной локали выглядит
> ShortDateFormat, или, скажем, LOCALE_SSHORTDATE?

ShortDateFormat = "dd.M.yyyy "г.""


 
Grihan   (2006-05-05 22:10) [14]

если резать "г."  для Болгаров, то, какие-нибуть арабы тоже захотят что-нибудь отрезать. Так на всех ненапасешся :)...


 
app ©   (2006-05-05 22:38) [15]

Кому сейчас легко и будь повежливее, не мы к тебе пришли, а ты к нам.


 
Мефисто   (2006-05-05 22:39) [16]

Лшдлуттнсфе    (05.05.06 21:07) [5]
Мефисто    (05.05.06 21:50) [9]

Для инвалидов повторим :)

 var
   FS: TFormatSettings;
begin
 FillChar(FS, SizeOf(FS), #0);
 GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, FS);
 FS.ShortDateFormat := "dd.m.yyyy";
 Caption := DateToStr(DateTimePicker1.DateTime, FS);
end;


 
Мефисто   (2006-05-05 22:41) [17]

Grihan    (05.05.06 22:10) [14]

Кстати, ты вредная личность. Переключился в региональных настроках на Болгарский все ок, переключился обратно на русский - винда устоновочный сидюк просит. И как после этого людям помогать... :(


 
Гаврила ©   (2006-05-05 22:46) [18]


> какие-нибуть арабы тоже захотят что-нибудь отреза


Уже режут. Равно как и Евреи.
По сабжу: Что мешает выкинуть все символы кроме цифр и точек?


 
Grihan   (2006-05-05 22:58) [19]

Уважаемый Мефисто, Вы Русский?
Болгар напишет дату на своем родном: "10.10.2005 г." (DateTimePicker вообще не причем, в текстовом редакторе написал), как мне его конвертить?
Более того стояла конкретная задача:


var
 S: string;
 Date: TDiteTime;
begin
 S:= "10.10.2005 г";
 Date := PleaseConvertThisString(S);
end;


реализовать функцию PleaseConvertThisString.


 
jack128 ©   (2006-05-05 23:05) [20]

Grihan   (05.05.06 22:58) [19]
Более того стояла конкретная задача:
var
S: string;
Date: TDiteTime;
begin
S:= "10.10.2005 г";
Date := PleaseConvertThisString(S);
end;
реализовать функцию PleaseConvertThisString.


ну если для данной конкретной задачи, то так:
function PleaseConvertThisString(const s: string): TDateTime;
begin
 Result := EncodeDate(2005, 10, 10)
end;


 
Grihan   (2006-05-05 23:09) [21]


> Что мешает выкинуть все символы кроме цифр и точек?


мешает то, что пользователь может ввести today, tomorrow или, еще хуже, mar1


 
Grihan   (2006-05-05 23:12) [22]


> function PleaseConvertThisString(const s: string): TDateTime;
>
> begin
>  Result := EncodeDate(2005, 10, 10)
> end;


:)
все верно
задача расширяется :)
теперь эта функция должна работать для всех Болгарских дат


 
KBsoft ©   (2006-05-05 23:14) [23]


> мешает то, что пользователь может ввести today, tomorrow
> или, еще хуже, mar1

А отруби ему эту возможность. Пусть только цифры да точки лупит.
Что-то сомневаюсь, что этот "Болгар" после года поставит один(!) пробел
букву "г" и затем точку не забудет. Ну о-о-о-очень сомневаюсь.


 
Гаврила ©   (2006-05-05 23:17) [24]

> мешает то, что пользователь может ввести today, tomorrow
> или, еще хуже, mar1

А  если пользователь напишет
"в день рождения моей бабушки", программа не должна случайно писать "16 апреля 1910 года"?


 
Grihan   (2006-05-05 23:20) [25]


> А отруби ему эту возможность. Пусть только цифры да точки
> лупит.
> Что-то сомневаюсь, что этот "Болгар" после года поставит
> один(!) пробел
> букву "г" и затем точку не забудет. Ну о-о-о-очень сомневаюсь.
>


Здорово придумал. Обломать кустомера. Нехай вообще только на экран смотрит. :) Жаль, что денег тогда он не даст :(

Да, Вы правы, писать " г." Болгар не будет. Но и стирать эту " г.", при редактировании даты он тоже не будет. :(


 
Grihan   (2006-05-05 23:24) [26]


> А  если пользователь напишет
> "в день рождения моей бабушки", программа не должна случайно
> писать "16 апреля 1910 года"?


Если заасигнен соответствующий евент в котором текст распознается или ресурс строка залокализована, то должна

P.S. советы по изменению юзабилити неприемлимы


 
Gast   (2006-05-05 23:24) [27]

Ну выделяй просто из строки "ДД.ММ.ГГГГ", а остальное игнорируй.
Или просто хочется поговорить?


 
Grihan   (2006-05-05 23:30) [28]


> Ну выделяй просто из строки "ДД.ММ.ГГГГ", а остальное игнорируй.
>
> Или просто хочется поговорить?


вследствии того, что с Болгарскими датами дельфа (и система, кстати тоже) нормально работать не умеет (это потому, что система нипель : туда дуй DateToStr, а оттуде ничего StrToDate), то придется плясать с бубном. :(


 
Мефисто   (2006-05-06 00:08) [29]

Покапавшись в справке решил дело так:

 const
   UserD = "dd.M.yyyy";
   XD = "06.5.2006 ã.";
 var
   FS: TFormatSettings;
   S, SysD: String;
   D: TDateTime;
begin
 D := 0;
 FillChar(FS, SizeOf(FS), #0);
 GetLocaleFormatSettings(LOCALE_USER_DEFAULT, FS);
 SysD := FS.ShortDateFormat;
 TryStrToDate(XD, D, FS);
 FS.ShortDateFormat := UserD;
 DateTimeToString(S, UserD, D, FS);
 Caption := S;
 FS.ShortDateFormat := SysD;
end;


 
Мефисто   (2006-05-06 00:12) [30]

Grihan    (05.05.06 23:30) [28]

Все умеет, главное в справке порыться.
Если будешь придераться и опять ни чего не работает, то на момент тестов у меня в региональных установках была Болгарская.


 
Плохиш ©   (2006-05-06 01:53) [31]


> Мефисто   (06.05.06 00:12) [30]

Легко же тебя на "СЛАБО" развести ;-)

> Grihan   (05.05.06 22:04) [11]
> нет, так не пойдет.
> Вы пожалуйста ответьте не следующие вопросы:
> 1) пробовали ли Вы сами?

Зачем?

> 2) Вы издеваетесь?

Уже "Да"

> 3) Как конвертнуть строчку "10.10.2005 г." (дата в Болгарской
> локале) в TDateTime?

Уже сказали, но никого это не интересует.


 
Grihan   (2006-05-06 09:52) [32]

Мефисто, а Вас не пугает, что TryStrToDate вернуло False? Если Ва нет, то меня пугает, ибо в Вашем пресловутом хелпе, на который Вы меня постоянно пытаетесь направить написано, что дата в этом случае не валидная. Более того, зачем Вы постоянно пытаетесь получить FormatSettings? Если Вы выставили Болгарскую локале, то все нужные значения уже в глобольных переменных.


 
Anatoly Podgoretsky ©   (2006-05-06 12:11) [33]

Задача преобразования неизвестных данныйх сводится к парсингу с применением Искуственного Интеллекта


 
Jeer ©   (2006-05-06 13:41) [34]

или экстрасенсов.


 
Мефисто   (2006-05-06 14:50) [35]

Grihan    (06.05.06 09:52) [32]

Условия задачи решены.

У меня в переменной D - содержадась искомая дата. Не пробовали проверить? Может у меня ОС особая? :) Понять так и не могу, почему у меня работает? Что я делаю не так?

Либо воспользуйтесь советом
Anatoly Podgoretsky ©   (06.05.06 12:11) [33]

Либо доведите до ума TryStrToDate, если считаете, что она не достаточно функциональна.


 
wicked ©   (2006-05-06 15:11) [36]

http://regexpstudio.com/ - качаем отсюда прекраснейший и бесплатнейший класс для работы с регекспами, пишем свои регекспы для выпаршивания несчастных дат и тихо радуемся жизни....
кстати, для улучшения юзабилити я еще такое встречал -
ежели ввели 1 цифру - это число текущего месяца текущего года...
2 цифры - число и месяц текущего года....
удобно.... но сложно..... поэтому меньше разводите шума и делайте так, как удобно и вам и юзеру....

тиресна, много ли болгаров с первого раза и без ошибок напишут слова "tomorrow" и "yesterday"?....


 
Мефисто   (2006-05-06 15:27) [37]

wicked  ©   (06.05.06 15:11) [36]

>> 2 цифры - число и месяц текущего года....

Это как? До меня не дошло? :)

А как с числом > 9 + число под месяц тоже > 9
Это как выгдядит?


 
KBsoft ©   (2006-05-06 16:43) [38]


> Здорово придумал. Обломать кустомера. Нехай вообще только
> на экран смотрит. :) Жаль, что денег тогда он не даст :(
>
> Да, Вы правы, писать " г." Болгар не будет. Но и стирать
> эту " г.", при редактировании даты он тоже не будет. :(


Тогда давайте с нуля:
1. Что куда вводится "Болгаром"?
2. Что там изначально (до того, как этот "Болгар" фокус переведет на этот компонент) уже указано?
3. Что он может и должен туда вводить?
4. А что получиться должно уже ясно: TDateTime.

А то так долго можно разговаривать, ходя вокруг этого "Болгара" :-)


 
Gast   (2006-05-06 17:16) [39]


> KBsoft ©   (06.05.06 16:43) [38]


> Тогда давайте с нуля:
> 1. Что куда вводится "Болгаром"?
> 2. Что там изначально (до того, как этот "Болгар" фокус
> переведет на этот компонент) уже указано?
> 3. Что он может и должен туда вводить?
> 4. А что получиться должно уже ясно: TDateTime.

Вероятно, что действия болгара логически определить невозможно: отрицая - он будет кивать головой, а утверждая наоборот - мотать ей в стороны. Что говорить о программах, когда случаются курьёзы в реальном общении кого-нибудь с болгарами:)


 
Grihan   (2006-05-06 20:55) [40]

Мефисто!

<ешкин кот> ...

мне что, заюзать TryStrToDate и не парится???  а что делать, если юзер написал в редакторе матом??? или "ешкин кот"?
для этого и анализируется результат работы трансформаторных функций. И как вы сами понимаете, мне будет трудно компьютеру объяснить следующее: не смотря на то, что функция TryStrToDate затрудняется пропарсить строку, она справилась со своей задачей. Честь ей и хвала.


 
Grihan   (2006-05-06 21:02) [41]


> > 1. Что куда вводится "Болгаром"?
> > 2. Что там изначально (до того, как этот "Болгар" фокус
> > переведет на этот компонент) уже указано?
> > 3. Что он может и должен туда вводить?
> > 4. А что получиться должно уже ясно: TDateTime.


1) Есть TxxSuperDateEdit, лежащий на форме. туда и вводит.
2) Предположительно программист, пожелающий воспользоватся TxxSuperDateEdit может захотеть проинициализировать TxxSuperDateEdit сегодняшним числом, чтобы конечному пользователю облегчить жизнь
3) конечный пользователь может вводить все что угодно, например:
 a) 10.10.2005
 b) 10.10.2005 г.
 c) today
 d) f...k
4) в случае, если пользователю повезло, и он ввел в редактор распознаваемый текст, мы его конвертим в TDateTime иначе выдаем сообщение об ошибке.


 
mfender ©   (2006-05-06 21:09) [42]

А болгары не пишут в TMaskEdit?


 
KilkennyCat ©   (2006-05-06 21:25) [43]

Удалено модератором


 
Мефисто   (2006-05-06 21:29) [44]

Grihan    (06.05.06 20:55) [40]

>> мне что, заюзать TryStrToDate и не парится???

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

И вообщем если честно, не совсем ясен ваш подход в данной ситуации. Пользователь вводит дату на свой манер, а программе это творчество расхлебывать? Почему бы просто не организовать давно проверенное средство - ввод данных по маске? Если создается некий SuperDateEdit - то распарсить дату вам придется... сложновато. Одно будет облегчение если вводу данных предшествовала хоть какая нибудь маска ввода, а в ином случае будет затруднительно отличить например: 10.10.2006 - на каком месте месяц, а на каком день?  Можно задать такую маску, что распарсить замучаешься: Сегодня 6 - 2006 год (май). Как анализировать? Плюс возможные опечатки пользователя.

Вобщем, сам решай, анализируй, мучайся ;)
Удачи в творческих успехах! :)


 
Virgo_Style ©   (2006-05-07 14:29) [45]

а если наш болгарин написал 02.03.17, то программа должна сама определить, где месяц, где день, и какое столетие имелось в виду? Как-то нереально это.


 
homm ©   (2006-05-07 21:30) [46]


>  [41] Grihan   (06.05.06 21:02)


> 4) в случае, если пользователю повезло, и он ввел в редактор
> распознаваемый текст, мы его конвертим в TDateTime иначе
> выдаем сообщение об ошибке.

Прежде чем хамить людям, которые тебе помогают, описал бы задачу. Что значит "распознаваемый". Наверное сам даже не задумывался.


 
Шутник   (2006-05-07 21:47) [47]

Гриха сутки трепался на форуме по пустяковому вопросу, вместо того, чтобы сесть, подумать и решить проблему без всяких выпендрёжей типа DecodeDate(StrToDate(DateToStr(TryStrToDate(TryDateToStr(TxxSuperDateEdit.Date)) ))).


 
TUser ©   (2006-05-08 10:26) [48]

Пользователь - существо бесправное. Он должен вводить данные в том формате, который предусмотрен в программе. А если ему вздумается написать today на китайском наречии, то программа должна сообщить об ошибке и попросить ввести дату еще раз.


 
Virgo_Style ©   (2006-05-08 13:13) [49]

Я бы сделал стандартный DateTimePicker или MonthCalendar, а уж рядом кнопочка для выбора известных дат из списка. Или ComboBox...


 
KilkennyCat ©   (2006-05-08 13:26) [50]

По поводу локализации программ написано куча статей, от теоретических до практических. Если память не изменяет, даже в стандартных делфевых примерах есть.
ИМХО, тут нужно просто четкое ТЗ.
Будет неоднозначное ТЗ - будет грамотное решение.

> TUser ©   (08.05.06 10:26)
> Пользователь - существо бесправное.

Не, так нельзя. Надо ему давать максимально много прав, но с умом, чтоб он сам себе не навредил при всем желании.


 
KilkennyCat ©   (2006-05-08 13:27) [51]


> [50] KilkennyCat ©   (08.05.06 13:26)


Опечатался.
Будет однозначное ТЗ - будет грамотное решение.


 
TUser ©   (2006-05-08 13:34) [52]

> Надо ему давать максимально много прав

Разрешить вводить дату по древнеегипетскому календарю?


 
KilkennyCat ©   (2006-05-08 13:42) [53]


> [52] TUser ©   (08.05.06 13:34)


Как дополнительная фишка - почему бы и нет, если не нарушает работу программы. Главное, в справке описать и оценить экономическую выгоду.



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

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

Наверх




Память: 0.59 MB
Время: 0.011 c
10-1120640656
StealthMan
2005-07-06 13:04
2006.06.18
Перезагрузка функции в Com Object


2-1149060826
Григорий
2006-05-31 11:33
2006.06.18
taskbar


2-1149078542
zxcv
2006-05-31 16:29
2006.06.18
array to image


2-1148957631
verybadbug
2006-05-30 06:53
2006.06.18
загрузка данных в webbrowser


1-1147258212
TUser
2006-05-10 14:50
2006.06.18
Где-то лежат dcu про запас





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский