Использую FormatDateTime('dddddd',StartDateTime), получаю "10 Май 2018 г", тогда как Windows 10 отображает "10 мая 2018 г".
Эту проблему можно решить стандартными средствами FPC 3.0.4 / Lazarus 1.8.0?
Длинная дата под русской Windows
Модератор: Модераторы
Скорее всего, нет. Здесь предлагается WinAPI-функция kernel32.GetDateFormat(Ex). RTL её не использует, а разбирает строку формата самостоятельно и подставляет именительный падеж месяца из [TFormatSettings.]LongMonthNames.
Быстро и грязно, чисто для русского языка, можно налепить вроде такого:
Быстро и грязно, чисто для русского языка, можно налепить вроде такого:
Код: Выделить всё
StringReplace(StringReplace(StringReplace('11 Май 2018',
'ь ', 'я ', [rfReplaceAll]), // январь, февраль, апрель, июнь, июль, сентябрь, октябрь, ноябрь, декабрь
'т ', 'та ', [rfReplaceAll]), // март, август
'й ', 'я ', [rfReplaceAll]) // майrunewalsh
А не случится "10 сенТАбря"?
А не случится "10 сенТАбря"?
Не знаю, чем это может быть плохо, но я сделал так:
В результате FormatDateTime('dddddd',StartDateTime) выдаёт 10 мая 2018 г
Код: Выделить всё
with DefaultFormatSettings do if LongMonthNames[1]='Январь' then
begin
LongMonthNames[1]:='января';
LongMonthNames[2]:='февраля';
LongMonthNames[3]:='марта';
LongMonthNames[4]:='апреля';
LongMonthNames[5]:='мая';
LongMonthNames[6]:='июня';
LongMonthNames[7]:='июля';
LongMonthNames[8]:='августа';
LongMonthNames[9]:='сентября';
LongMonthNames[10]:='октября';
LongMonthNames[11]:='ноября';
LongMonthNames[12]:='декабря';
end;
В результате FormatDateTime('dddddd',StartDateTime) выдаёт 10 мая 2018 г
Код: Выделить всё
function GetGenStrDate(aDate: TDate): string;
var i: integer;
s: TSystemTime;
a: PWideChar;
begin
DateTimeToSystemTime(aDate, s);
a := GetMem(42);
i := GetDateFormatW(LOCALE_USER_DEFAULT, 0, @s, 'd MMMM yyyy', a, 42);
Result := StrPas(a);
FreeMem(a, 42);
end;Vadim
Не случится, там специально пробелы.
Выше почти идеальный вариант, байкшедну его немножко:
Не случится, там специально пробелы.
Выше почти идеальный вариант, байкшедну его немножко:
Код: Выделить всё
function GetGenStrDate(aDate: TDate): widestring;
var
pass: integer;
s: TSystemTime;
begin
DateTimeToSystemTime(aDate, s);
for pass := 0 to 1 do
SetLength(result, GetDateFormatW(LOCALE_USER_DEFAULT, 0, @s, 'd MMMM yyyy', PWideChar(result), length(result)));
end;