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

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

Получить дату без года в формате текущих региональных настроек [D6, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2 3

Falcon ©   (2007-10-21 01:25:00) 

Нужно из даты TDate получить текстовую дату без года в формате текущих региональных настроек. Например, региональные настройки под США, дата 31 декабря 2007, нужно преобразовать в string: '12/31'.

Возможно ламерский вопрос. Но с ходу не смог найти решение, не нашел ничего и в инете.


DVM   (2007-10-21 14:11:00) [21]


> Но это условно, решается на уровне ресурса SLongMonthNameOct.

И так для всех языков, даже для нас неизвестных делать будем? Как?


> Anatoly Podgoretsky ©   (21.10.07 14:00) [24]


> Ну и чего проблеме удалить все знаки, кроме d и M, учитывая
> литеральные встроеные константы. После удаления останется
> только "d MMMM" в данном случае.

если в региональных настройках стоит MMMM yyyy 'г.' (именно так без дня вообще, а почему бы и нет), то

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

Невыполнимо. Если добавим от себя день, то это будет уже не соотвтствовать настройкам


Leonid Troyanovsky   (2007-10-21 14:06:00) [22]


> DVM ©   (21.10.07 13:55) [22]

> Должно быть: 21 октября 2007 г.

LongMonthNames[10] := 'октября';
Но это условно, решается на уровне ресурса SLongMonthNameOct.

--
Regards, LVT.


DVM   (2007-10-21 14:05:00) [23]


> Anatoly Podgoretsky ©   (21.10.07 14:00) [24]

Это понятно, но речь не об этом. см. [17]. Есть функция в Делфи выводящая полный формат даты на нормальном языке или нет?


Anatoly Podgoretsky   (2007-10-21 14:00:00) [24]

> DVM  (21.10.2007 13:55:22)  [22]

Ну и чего проблеме удалить все знаки, кроме d и M, учитывая литеральные встроеные константы. После удаления останется только "d MMMM" в данном случае.


DVM   (2007-10-21 13:57:00) [25]


> Дельфийский подход иной (хуже или лучше - это другой вопрос).

значит [18] это не ответ на вопрос [17].


DVM   (2007-10-21 13:55:00) [26]


> Leonid Troyanovsky ©   (21.10.07 13:43) [18]

Дельфийская FormatDateTime(LongDateFormat, Date) выводит дату вида:

21 Октябрь 2007 г.

Это при маске d MMMM yyyy 'г.'

Должно быть: 21 октября 2007 г.


Leonid Troyanovsky   (2007-10-21 13:54:00) [27]


> DVM ©   (21.10.07 13:48) [20]

> Сравните [18] и

Зачем?
Локализация приложения - более сложная проблема,
чем некоторые частные решения.
Дельфийский подход иной (хуже или лучше - это другой вопрос).

--
Regards, LVT.


DVM   (2007-10-21 13:48:00) [28]


> 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:47:00) [29]


> sniknik ©   (21.10.07 11:12) [9]

>  типа убрать из маски "yy.." ([5])) необходимое из вопроса
> не проблема.

И еще учесть, что разделитель даты может быть не односимвольный.
Да и еще многие тонкости. Задача, в общем случае, нетривиальна.

Проще, IMHO, спросить юзера, как он хочет видеть оное.

--
Regards, LVT.


Leonid Troyanovsky   (2007-10-21 13:43:00) [30]


> DVM ©   (21.10.07 13:35) [17]

> Видимо. Может подскажете функцию Delphi для получения даты
> в полном формате (для региональных настроек "русский" это
> 21 октября 2007).

FormatDateTime(LongDateFormat, Date)

--
Regards, LVT.


DVM   (2007-10-21 13:35:00) [31]


> Видимо, еще многое осталось незамеченным.

Видимо. Может подскажете функцию Delphi для получения даты в полном формате (для региональных настроек "русский" это 21 октября 2007).


> Falcon

А на самом деле, задача неразрешимая. Даже если мы получим текщую строку форматирования даты (через GetLocaleInfo), то в ней может действительно отстутствовать как день так и месяц (их запросто могли убрать оттуда пользователи).


Leonid Troyanovsky   (2007-10-21 13:14:00) [32]


> DVM ©   (21.10.07 13:01) [15]

> насколько я знаю, нет функции, способной вывести дату или
> время с учетом региональных настроек.

Видимо, еще многое осталось незамеченным.

--
Regards, LVT.


DVM   (2007-10-21 13:01:00) [33]


> DrPass ©   (21.10.07 12:53) [14]

Да я сразу не заметил, что ему из TDateTime. А в делфи, насколько я знаю, нет функции, способной вывести дату или время с учетом региональных настроек.


DrPass   (2007-10-21 12:53:00) [34]


> DVM ©   (21.10.07 12:21) [11]

А зачем все это? Есть же готовые библиотечные функции, да к вопросу автора никакого отношения не имеет...


DVM   (2007-10-21 12:29:00) [35]

Но [11] это для TSystemTime. Для TDateTime лучше сделать FormatDateTime как советовали выше.


DVM   (2007-10-21 12:23:00) [36]

[11] выводит дату с учетом региональных настроек. Тип вывода даты меняется в GetLocaleInfo параметр LOCALE_SSHORTDATE


DVM   (2007-10-21 12:21:00) [37]

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;


Jump   (2007-10-21 12:18:00) [38]

Изначально ветка не заслуживает перемещения в "Начинающие", имхо.

Думаешь, не заслуживает?

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

А если пользователь убрал в региональных настройках отображение дня (mm/yyyy)? Или месяца(dd/yyyy)? Или на самом деле убрал год(dd/mm)? Что делать думаешь? Или надеешься, что пользователь такого никогда не сделает? Не надейся. Региональные настройки могут быть любыми. В том числе - без месяца и дня. В таком контексте твой вопрос вообще теряет всякий смысл.

Я бы на твоем месте сделал:

FormatDateTime('dd/mmm', Date);

и не парил бы себе мозги.


sniknik   (2007-10-21 11:12:00) [39]

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

> А при чём тут всякого рода переменные?
есть такие переменные в дельфи куда копируются локальные в том числе региональных настройки среды... и в которых есть вся необходимая инфа, и что разделителем в дате и порядок число/месяц (маска), т.е. посмотреть и составить(/настроить, типа убрать из маски "yy.." ([5])) необходимое из вопроса не проблема.


Германн   (2007-10-21 03:58:00) [40]


> Плохиш ©   (21.10.07 03:44) [7]
>
>

Изначально ветка не заслуживает перемещения в "Начинающие", имхо.
А при чём тут всякого рода переменные?


Страницы:   1 2 3

Наверх

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