Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
ВнизПолучить дату без года в формате текущих региональных настроек Найти похожие ветки
← →
Falcon (2007-10-21 01:25) [0]Нужно из даты TDate получить текстовую дату без года в формате текущих региональных настроек. Например, региональные настройки под США, дата 31 декабря 2007, нужно преобразовать в string: "12/31".
Возможно ламерский вопрос. Но с ходу не смог найти решение, не нашел ничего и в инете.
← →
Falcon (2007-10-21 01:27) [1]основная проблема в том, что если преобразовать в string, а потом из него отрезать год, то как определить в каком участке строки год (в начале или конце) с учетом текущих региональных настроек на машине.
← →
Плохиш © (2007-10-21 02:00) [2]
> Falcon (21.10.07 01:27) [1]
> основная проблема в том, что если преобразовать в string
DecodeDate и преобразовываешь день и месяц в строку как душа пожелает...
← →
Германн © (2007-10-21 02:51) [3]
> DecodeDate и преобразовываешь день и месяц в строку как
> душа пожелает...
То же самое делает и FormatDateTime, но автора интересует не желания души, а "региональные настройки".
Имхо, в общем случае нет решения.
← →
Плохиш © (2007-10-21 02:53) [4]
> Германн © (21.10.07 02:51) [3]
Хм, всегда думал, что в слова "как душа пожелает" и какие-то там "региональные настройки" входят. Я ошибался?
← →
DrPass © (2007-10-21 02:59) [5]ShortDateFormat:= StringReplace(ShortDateFormat, "y", "", [rfReplaceAll])
;)
← →
Германн © (2007-10-21 03:23) [6]
> Плохиш © (21.10.07 02:53) [4]
>
>
> > Германн © (21.10.07 02:51) [3]
>
> Хм, всегда думал, что в слова "как душа пожелает" и какие-
> то там "региональные настройки" входят. Я ошибался?
>
Тогда нужно дать ответ на
> Falcon (21.10.07 01:27) [1]
← →
Плохиш © (2007-10-21 03:44) [7]
> Германн © (21.10.07 03:23) [6]
А вот когда ветку отправят в начинающие, тогда и будем рассказывать, в какие переменные и когда заносятся сведения о региональных настройках ;-)
← →
Германн © (2007-10-21 03:58) [8]
> Плохиш © (21.10.07 03:44) [7]
>
>
Изначально ветка не заслуживает перемещения в "Начинающие", имхо.
А при чём тут всякого рода переменные?
← →
sniknik © (2007-10-21 11:12) [9]> Изначально ветка не заслуживает перемещения в "Начинающие", имхо.
значит он их сам найдет, инфы дано уже с перебором.
> А при чём тут всякого рода переменные?
есть такие переменные в дельфи куда копируются локальные в том числе региональных настройки среды... и в которых есть вся необходимая инфа, и что разделителем в дате и порядок число/месяц (маска), т.е. посмотреть и составить(/настроить, типа убрать из маски "yy.." ([5])) необходимое из вопроса не проблема.
← →
Jump (2007-10-21 12:18) [10]Изначально ветка не заслуживает перемещения в "Начинающие", имхо.
Думаешь, не заслуживает?
Нужно из даты TDate получить текстовую дату без года в формате текущих региональных настроек.
А если пользователь убрал в региональных настройках отображение дня (mm/yyyy)? Или месяца(dd/yyyy)? Или на самом деле убрал год(dd/mm)? Что делать думаешь? Или надеешься, что пользователь такого никогда не сделает? Не надейся. Региональные настройки могут быть любыми. В том числе - без месяца и дня. В таком контексте твой вопрос вообще теряет всякий смысл.
Я бы на твоем месте сделал:FormatDateTime("dd/mmm", Date);
и не парил бы себе мозги.
← →
DVM © (2007-10-21 12:21) [11]function GetShortDate: string; // 01.01.2003
var
st: TSystemTime;
Date, FormatString: PChar;
DateSize, FormatStringSize: integer;
begin
Result := "";
FormatStringSize := GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, nil, 0);
GetMem(FormatString, FormatStringSize * SizeOf(Char));
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, FormatString, FormatStringSize);
GetLocalTime(st);
DateSize := GetDateFormat(LOCALE_USER_DEFAULT, 0, nil, FormatString, nil, 0);
GetMem(Date, DateSize * SizeOf(Char));
GetDateFormat(LOCALE_USER_DEFAULT, 0, @st, FormatString, Date, DateSize * SizeOf(Char));
result := Date;
FreeMem(Date);
FreeMem(FormatString);
end;
← →
DVM © (2007-10-21 12:23) [12][11] выводит дату с учетом региональных настроек. Тип вывода даты меняется в GetLocaleInfo параметр LOCALE_SSHORTDATE
← →
DVM © (2007-10-21 12:29) [13]Но [11] это для TSystemTime. Для TDateTime лучше сделать FormatDateTime как советовали выше.
← →
DrPass © (2007-10-21 12:53) [14]
> DVM © (21.10.07 12:21) [11]
А зачем все это? Есть же готовые библиотечные функции, да к вопросу автора никакого отношения не имеет...
← →
DVM © (2007-10-21 13:01) [15]
> DrPass © (21.10.07 12:53) [14]
Да я сразу не заметил, что ему из TDateTime. А в делфи, насколько я знаю, нет функции, способной вывести дату или время с учетом региональных настроек.
← →
Leonid Troyanovsky © (2007-10-21 13:14) [16]
> DVM © (21.10.07 13:01) [15]
> насколько я знаю, нет функции, способной вывести дату или
> время с учетом региональных настроек.
Видимо, еще многое осталось незамеченным.
--
Regards, LVT.
← →
DVM © (2007-10-21 13:35) [17]
> Видимо, еще многое осталось незамеченным.
Видимо. Может подскажете функцию Delphi для получения даты в полном формате (для региональных настроек "русский" это 21 октября 2007).
> Falcon
А на самом деле, задача неразрешимая. Даже если мы получим текщую строку форматирования даты (через GetLocaleInfo), то в ней может действительно отстутствовать как день так и месяц (их запросто могли убрать оттуда пользователи).
← →
Leonid Troyanovsky © (2007-10-21 13:43) [18]
> DVM © (21.10.07 13:35) [17]
> Видимо. Может подскажете функцию Delphi для получения даты
> в полном формате (для региональных настроек "русский" это
> 21 октября 2007).
FormatDateTime(LongDateFormat, Date)
--
Regards, LVT.
← →
Leonid Troyanovsky © (2007-10-21 13:47) [19]
> sniknik © (21.10.07 11:12) [9]
> типа убрать из маски "yy.." ([5])) необходимое из вопроса
> не проблема.
И еще учесть, что разделитель даты может быть не односимвольный.
Да и еще многие тонкости. Задача, в общем случае, нетривиальна.
Проще, IMHO, спросить юзера, как он хочет видеть оное.
--
Regards, LVT.
← →
DVM © (2007-10-21 13:48) [20]
> Leonid Troyanovsky © (21.10.07 13:43) [18]
Сравните [18] и
function GetLongDate: string;
var
st: TSystemTime;
Date, FormatString: PChar;
DateSize, FormatStringSize: integer;
begin
Result := "";
FormatStringSize := GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, nil, 0);
GetMem(FormatString, FormatStringSize * SizeOf(Char));
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLONGDATE, FormatString, FormatStringSize);
GetLocalTime(st);
DateSize := GetDateFormat(LOCALE_USER_DEFAULT, 0, nil, FormatString, nil, 0);
GetMem(Date, DateSize * SizeOf(Char));
GetDateFormat(LOCALE_USER_DEFAULT, 0, @st, FormatString, Date, DateSize * SizeOf(Char));
result := Date;
FreeMem(Date);
FreeMem(FormatString);
end;
← →
Leonid Troyanovsky © (2007-10-21 13:54) [21]
> DVM © (21.10.07 13:48) [20]
> Сравните [18] и
Зачем?
Локализация приложения - более сложная проблема,
чем некоторые частные решения.
Дельфийский подход иной (хуже или лучше - это другой вопрос).
--
Regards, LVT.
← →
DVM © (2007-10-21 13:55) [22]
> Leonid Troyanovsky © (21.10.07 13:43) [18]
Дельфийская FormatDateTime(LongDateFormat, Date) выводит дату вида:
21 Октябрь 2007 г.
Это при маске d MMMM yyyy "г."
Должно быть: 21 октября 2007 г.
← →
DVM © (2007-10-21 13:57) [23]
> Дельфийский подход иной (хуже или лучше - это другой вопрос).
значит [18] это не ответ на вопрос [17].
← →
Anatoly Podgoretsky © (2007-10-21 14:00) [24]> DVM (21.10.2007 13:55:22) [22]
Ну и чего проблеме удалить все знаки, кроме d и M, учитывая литеральные встроеные константы. После удаления останется только "d MMMM" в данном случае.
← →
DVM © (2007-10-21 14:05) [25]
> Anatoly Podgoretsky © (21.10.07 14:00) [24]
Это понятно, но речь не об этом. см. [17]. Есть функция в Делфи выводящая полный формат даты на нормальном языке или нет?
← →
Leonid Troyanovsky © (2007-10-21 14:06) [26]
> DVM © (21.10.07 13:55) [22]
> Должно быть: 21 октября 2007 г.
LongMonthNames[10] := "октября";
Но это условно, решается на уровне ресурса SLongMonthNameOct.
--
Regards, LVT.
← →
DVM © (2007-10-21 14:11) [27]
> Но это условно, решается на уровне ресурса SLongMonthNameOct.
И так для всех языков, даже для нас неизвестных делать будем? Как?
> Anatoly Podgoretsky © (21.10.07 14:00) [24]
> Ну и чего проблеме удалить все знаки, кроме d и M, учитывая
> литеральные встроеные константы. После удаления останется
> только "d MMMM" в данном случае.
если в региональных настройках стоит MMMM yyyy "г." (именно так без дня вообще, а почему бы и нет), то
> Нужно из даты TDate получить текстовую дату без года в формате
> текущих региональных настроек.
Невыполнимо. Если добавим от себя день, то это будет уже не соотвтствовать настройкам
← →
DVM © (2007-10-21 14:14) [28]
> LongMonthNames[10] := "октября";
плюс если мы исправим так, то неправильно будет работать делфийская функция, когда нам понадобится название месяца в именительном падеже.
← →
Anatoly Podgoretsky © (2007-10-21 14:16) [29]> DVM (21.10.2007 14:11:27) [27]
То согласно вопроса, получится "MMMM" и сразу предупредаю вопрос, если будет без года тоже отработает, год будет удален вне зависимости указан он или нет и не важно где он будет указан.
Так что не старайся придумать форматы.
← →
Leonid Troyanovsky © (2007-10-21 14:17) [30]
> DVM © (21.10.07 14:11) [27]
> И так для всех языков, даже для нас неизвестных делать будем?
> Как?
Видимо, как описано в главе про интернациализацию и локализацию.
Чудес не бывает, придется и переводчиков нанимать ;)
--
Regards, LVT.
← →
DVM © (2007-10-21 14:17) [31]
> Так что не старайся придумать форматы.
так я и не придумываю - говорю же задача не выполнима в общем случае.
← →
Anatoly Podgoretsky © (2007-10-21 14:20) [32]> DVM (21.10.2007 14:17:31) [31]
Вот как раз в общем то и решаема, а не решаема, возможно, в частных случаях.
← →
DVM © (2007-10-21 14:24) [33]
> Вот как раз в общем то и решаема, а не решаема, возможно,
> в частных случаях.
В общем, к сведению, это значит для всех возможных ситуаций. Если есть ситуации, для которых задача не решаема, то она не решаема в общем случае, но имеет частные решения.
> Видимо, как описано в главе про интернациализацию и локализацию.
А если неизвестно заранее какие языки встретятся программе в процессе ее работы? Чем делать лишнюю работу по локализации не проще ли воспользоваться тем, что уже есть в системе.
Та же песня про MessageBox и надписи на кнопках в MessageDlg
← →
Leonid Troyanovsky © (2007-10-21 14:25) [34]
> DVM © (21.10.07 14:14) [28]
> плюс если мы исправим так, то неправильно будет работать
> делфийская функция, когда нам понадобится название месяца
> в именительном падеже.
Массива, IMHO, вполне хватит ;)
Да, и не обязательно менять что-то глобально,
есть еще и TFormatSettings.
--
Regards, LVT.
← →
korneley © (2007-10-21 14:27) [35]Так человеку и нужен "частный случай"... И все уже решено, и советы даны, о чем спорим-то?
← →
DVM © (2007-10-21 14:30) [36]
> korneley © (21.10.07 14:27) [35]
даже его частный случай не имеет решения, т.к. в окне настройки региональных параметров отображения даты пользователь компьютера может написать "Здесь был Вася" вместо маски и все.
← →
Anatoly Podgoretsky © (2007-10-21 14:31) [37]> DVM (21.10.2007 14:30:36) [36]
Вот что и хотел, то и получит - ничего
← →
Leonid Troyanovsky © (2007-10-21 14:31) [38]
> DVM © (21.10.07 14:24) [33]
> А если неизвестно заранее какие языки встретятся программе
> в процессе ее работы? Чем делать лишнюю работу по локализации
> не проще ли воспользоваться тем, что уже есть в системе.
Вот и получаются так лоскутно локализованные шалтаи-болтаи,
ведущие себя не одинаково в разных системах.
Про MessageDlg тоже, кстати.
--
Regards, LVT.
← →
DVM © (2007-10-21 14:37) [39]
> Вот и получаются так лоскутно локализованные шалтаи-болтаи,
>
> ведущие себя не одинаково в разных системах.
Это сложный вопрос, что хуже. Некоторые вещи все равно мы не переведем, как бы не старались на язык отличный от языка системы. Например, OpenDialog-и.
← →
Leonid Troyanovsky © (2007-10-21 14:55) [40]
> DVM © (21.10.07 14:37) [39]
> Это сложный вопрос, что хуже. Некоторые вещи все равно мы
> не переведем, как бы не старались на язык отличный от языка
> системы. Например, OpenDialog-и.
Tо, что будет легко - никто не обещал.
Не только потому, что борланды занимают пупоцентрическую позицию
(что им какие-то Росиия или Китай) или, скажем, у них ресурсов поменее, что у MS, но и потому, что это объективно сложно.
Но, в любом случае, было б желание, а сделать можно.
--
Regards, LVT.
← →
DVM © (2007-10-21 15:04) [41]
> Leonid Troyanovsky ©
у вас анкета слетела, посмотрите.
← →
Leonid Troyanovsky © (2007-10-21 15:36) [42]
> DVM © (21.10.07 15:04) [41]
> у вас анкета слетела, посмотрите.
- А у вас ус отклеился.
- Спасибо..
:)
fixed.
--
Regards, LVT.
← →
Плохиш © (2007-10-21 21:32) [43]
> Leonid Troyanovsky © (21.10.07 14:06) [26]
>
> > DVM © (21.10.07 13:55) [22]
>
> > Должно быть: 21 октября 2007 г.
>
> LongMonthNames[10] := "октября";
Бедные немцы/англичане/ и т.д., у них и словов-то таких нет :-))
← →
Leonid Troyanovsky © (2007-10-21 22:13) [44]
> Плохиш © (21.10.07 21:32) [43]
> Бедные немцы/англичане/ и т.д., у них и словов-то таких
> нет :-))
Немцы происходят от слова "немые", т.е. сие неудивительно.
А вот потребность локализовать дельфийское приложение для
англичан несколько неожиданно.
Хотя, возможно, что именно так и поступают, скажем, индусы.
--
Regards, LVT.
← →
Falcon (2007-10-21 22:34) [45]Всем большое спасибо. Несколько лет не писал на Дельфи, многое подзабыл. Начиная с комментариев [2]-[4] стало понятно как решить свою проблему. По сути вот как:
StringReplace(ShortDateFormat, "y", "", [rfReplaceAll])
;)
P.S. Не зря топик перенесли в этот раздел :)
P.P.S. Не бывает ничего не разрешимого.
← →
Leonid Troyanovsky © (2007-10-21 22:43) [46]
> Falcon (21.10.07 22:34) [45]
> как решить свою проблему.
Конечно, свои проблемы сподручнее решать собс-ручно.
А по сути можно добавить, что никто не запрещает
даже такой разделитель даты: {y}
И нет нужды менять ShortDateFormat при наличии FormatDateTime.
--
Regards, LVT.
← →
Falcon (2007-10-21 22:47) [47]
> Конечно, свои проблемы сподручнее решать собс-ручно.
Согласен
>
> А по сути можно добавить, что никто не запрещает
> даже такой разделитель даты: {y}
> И нет нужды менять ShortDateFormat при наличии FormatDateTime.
>
Менять ShortDateFormat не буду :)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.056 c