Главная страница
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.



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

Текущий архив: 2007.11.11;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.026 c
15-1191786511
Kostafey
2007-10-07 23:48
2007.11.11
Автоматизация конфигурирования настроек IE 6/7


9-1162945673
cxvxc
2006-11-08 03:27
2007.11.11
Спрайт OpenGL


8-1168929934
_Dimm
2007-01-16 09:45
2007.11.11
DSPack - PlayCap


4-1177134586
Admiral
2007-04-21 09:49
2007.11.11
снимки системного реестра


3-1183217200
Dust
2007-06-30 19:26
2007.11.11
Запрос не видит временную таблицу