Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.



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

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

Наверх





Память: 0.55 MB
Время: 0.052 c
2-1192788766
OlegMa1
2007-10-19 14:12
2007.11.11
Простой TObject


15-1191917559
БарЛог
2007-10-09 12:12
2007.11.11
Direct Connect - сервер


15-1191959183
Bogdan1024
2007-10-09 23:46
2007.11.11
суперсистема синхронизации паролей


8-1168871218
olegnik
2007-01-15 17:26
2007.11.11
сжатия изображения bitmap.


2-1192726332
Malik
2007-10-18 20:52
2007.11.11
PopupMenu





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