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

Вниз

Получить дату без года в формате текущих региональных настроек   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.016 c
2-1192786979
Aladdinych
2007-10-19 13:42
2007.11.11
Как создать почтовой сообщение


8-1169318785
mary84
2007-01-20 21:46
2007.11.11
как создать в базе данных таблицу картинок jpg


15-1191966748
Petr V. Abramov
2007-10-10 01:52
2007.11.11
действительно сломалось все


15-1190984490
lookin
2007-09-28 17:01
2007.11.11
Загрузить старые ветки


2-1192729888
Jimmy
2007-10-18 21:51
2007.11.11
Сколько памяти занимает программа