Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как получить написания дня недели и месяца из локали?  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1282
Как известно есть функция FormatDateTime где в качестве параметра можно задать формат представления даты:
FormatDateTime('d mmm yyyy', Now)
но мы получим некрасивое написание месяца т.е. май, январь и т.д., а хотелось бы мая, января и т.д.
Конечно можно сделать текстовый массив, но если текущая локаль не русская то выйдет некрасиво, а ведь в системе уже есть правильный список месяцев - отсюда вопрос, как его выдрать?
6 май 18, 13:15    [21390594]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2606
ты дольше писал
6 май 18, 13:46    [21390677]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1282
Дык ответа то все равно нет. Я могу еще пол страницы написать, если это поможет :)
6 май 18, 14:54    [21390782]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
чччД
Guest
В .net есть DateTimeFormatInfo::MonthGenitiveNames, а нам - "ручками".
Или воспользоваться подручными средствами. Например, некоторые СУБД умеют такое.
6 май 18, 17:59    [21391096]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
Страдалецъ
Member

Откуда: Мурманск
Сообщений: 1282
Я и сам могу список сделать, но вопрос то как извлечь эти данные из системы.
6 май 18, 18:46    [21391159]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2524
Страдалецъ,

гугл пробовал спрашивать? одна из первых ссылок поиска по FormatDateTime:

http://www.delphibasics.ru/FormatDateTime.php

ты дольше писал.
6 май 18, 19:36    [21391232]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
Док
Member

Откуда: Казань
Сообщений: 5601
Страдалецъ,

+
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
    s: String;
    MyFS: TFormatSettings;
begin
  with MyFS do
  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;

  Memo1.Clear;

  with DefaultFormatSettings do
  begin
    for i:= Low(LongMonthNames) to High(LongMonthNames) do
      Memo1.Lines.Add(LongMonthNames[i] + '/' + MyFS.LongMonthNames[i]);
  end;
  Memo1.Lines.Add('======================');
  Memo1.Lines.Add('');
  Memo1.Lines.Add('Сегодня: ' + FormatDateTime('d mmmm yyyy', Now, MyFS));
end;  


К сообщению приложен файл. Размер - 16Kb
6 май 18, 19:47    [21391254]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
ma1tus
Member

Откуда:
Сообщений: 507
Страдалецъ
в системе уже есть
и на форуме есть...
6 май 18, 20:13    [21391300]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
чччД
Guest
Страдалецъ
Я и сам могу список сделать, но вопрос то как извлечь эти данные из системы.

Нет их в системе. Ну, только в новых Win вроде есть.
6 май 18, 20:47    [21391360]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
Aniskin
Member

Откуда:
Сообщений: 244
Windows 7 и выше.

function GetCalendarInfo(Locale: LCID; Calendar: DWORD; CalType: DWORD; lpCalData: LPTSTR;
  cchData: Integer; lpValue: LPDWORD): Integer; stdcall; external kernel32 name 'GetCalendarInfoW';

const
  LOCALE_RETURN_GENITIVE_NAMES = $10000000;   //Flag to return the Genitive forms of month names
  LOCALE_ALLOW_NEUTRAL_NAMES   = $08000000;   //Flag to allow returning neutral names/lcids for name conversion

  CAL_GREGORIAN                = 1;      // Gregorian (localized) calendar

  CAL_SMONTHNAME1           = $00000015;  // native name for January
  CAL_SMONTHNAME2           = $00000016;  // native name for February
  CAL_SMONTHNAME3           = $00000017;  // native name for March
  CAL_SMONTHNAME4           = $00000018;  // native name for April
  CAL_SMONTHNAME5           = $00000019;  // native name for May
  CAL_SMONTHNAME6           = $0000001a;  // native name for June
  CAL_SMONTHNAME7           = $0000001b;  // native name for July
  CAL_SMONTHNAME8           = $0000001c;  // native name for August
  CAL_SMONTHNAME9           = $0000001d;  // native name for September
  CAL_SMONTHNAME10          = $0000001e;  // native name for October
  CAL_SMONTHNAME11          = $0000001f;  // native name for November
  CAL_SMONTHNAME12          = $00000020;  // native name for December
  CAL_SMONTHNAME13          = $00000021;  // native name for 13th month (if any)

// AIndex is 1-based
function GetMonthName(AIndex: Integer): UnicodeString;
var
  CalType: DWORD;
  L: Integer;
begin
  Result := '';
  CalType := (CAL_SMONTHNAME1 + AIndex - 1) or LOCALE_RETURN_GENITIVE_NAMES;
  L := GetCalendarInfo(LOCALE_USER_DEFAULT, CAL_GREGORIAN, CalType, nil, 0, nil);
  if L < 2 then Exit;
  SetLength(Result, L - 1);
  GetCalendarInfo(LOCALE_USER_DEFAULT, CAL_GREGORIAN, CalType, PWideChar(Result), L, nil);
end;
7 май 18, 06:12    [21391930]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 2872
Страдалецъ,

GetLocaleInfo
7 май 18, 14:47    [21393240]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 28793

06.05.2018 13:15, Страдалецъ пишет:
> мы получим некрасивое написание месяца т.е. май, январь и т.д., а хотелось бы мая, января и т.д.

странно.
я получаю "мая" и "января".
использую стандартную функцию GetDateFormat().
что я делаю не так?

Posted via ActualForum NNTP Server 1.5

7 май 18, 16:08    [21393494]     Ответить | Цитировать Сообщить модератору
 Re: Как получить написания дня недели и месяца из локали?  [new]
чччД
Guest
Мимопроходящий,

точно, какой же ты лапочка!

function GetGenStrDate(aDate: TDate): string;
var
  i: integer;
  s: SystemTime;
begin
  DateTimeToSystemTime(aDate, s);
  SetString(Result, nil, 42);
  i := GetDateFormat(LOCALE_USER_DEFAULT, 0, @s, 'd MMMM yyyy', PChar(Result), 42);
  SetLength(Result, Pred(i));
end;

...ну, надо чуть подправить для юникодных строк.
7 май 18, 16:37    [21393602]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить