Длинная дата под русской Windows

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Длинная дата под русской Windows

Сообщение Vodnik » 11.05.2018 01:04:24

Использую FormatDateTime('dddddd',StartDateTime), получаю "10 Май 2018 г", тогда как Windows 10 отображает "10 мая 2018 г".
Эту проблему можно решить стандартными средствами FPC 3.0.4 / Lazarus 1.8.0?
Vodnik
новенький
 
Сообщения: 45
Зарегистрирован: 24.12.2016 01:14:23

Re: Длинная дата под русской Windows

Сообщение runewalsh » 11.05.2018 01:31:47

Скорее всего, нет. Здесь предлагается WinAPI-функция kernel32.GetDateFormat(Ex). RTL её не использует, а разбирает строку формата самостоятельно и подставляет именительный падеж месяца из [TFormatSettings.]LongMonthNames.

Быстро и грязно, чисто для русского языка, можно налепить вроде такого:
Код: Выделить всё
StringReplace(StringReplace(StringReplace('11 Май 2018',
      'ь ', 'я ', [rfReplaceAll]), // январь, февраль, апрель, июнь, июль, сентябрь, октябрь, ноябрь, декабрь
      'т ', 'та ', [rfReplaceAll]), // март, август
      'й ', 'я ', [rfReplaceAll]) // май
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Длинная дата под русской Windows

Сообщение Vadim » 11.05.2018 09:27:00

runewalsh
А не случится "10 сенТАбря"? :-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Длинная дата под русской Windows

Сообщение Vodnik » 11.05.2018 13:22:57

Не знаю, чем это может быть плохо, но я сделал так:
Код: Выделить всё
  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 г
Vodnik
новенький
 
Сообщения: 45
Зарегистрирован: 24.12.2016 01:14:23

Re: Длинная дата под русской Windows

Сообщение wadman » 11.05.2018 13:56:58

Код: Выделить всё
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;
wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

Re: Длинная дата под русской Windows

Сообщение runewalsh » 11.05.2018 14:42:18

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;
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru