четверг, 19 марта 2009 г.

Format day of week as string

Неожиданно столкнулся с проблемой, что в Windows нет(или просто я не нашел) тривиального способа получить список всех дней недели в определенной локали. Первым делом, конечно, выбор пал на функцию strtime. Код получился вот такой:
 setlocale( LC_ALL, ".1251" ); 
struct tm tm_temp = {0};
wchar_t day_buf[50];
for ( int n = 0; n < 7; ++n ) {
tm_temp.tm_wday = n;
wcsftime( day_buf, 50, L"%A", &tm_temp );
wcout << day_buf << endl;
}
Тут вроде все как нужно за тем исключением, что setlocale принимает не LCID. В Windows есть свои NLS функции. Попробуем их — получается что-то такое:
 // LCID langid где-то определен
SYSTEMTIME sys_time = {0};
wchar_t day_buf[100] = {0};
for ( int n = 0; n < 7; ++n ) {
sys_time.wDayOfWeek = n;
GetDateFormat( langid, 0, &sys_time, L"dddd", day_buf, 100 );
wcout << day_buf << endl;
}
Однако, GetDateFormat не смотрит на параметр wDayOfWeek. Пришлось взять дату, в которую было воскресенье и от неё выводить дни. Как-то так:
 // LCID langid где-то определен
SYSTEMTIME sys_time = { 2009, 3, 0, 15, 0, 0, 0, 0 };
wchar_t day_buf[100] = {0};
for ( int n = 0; n < 7; ++n ) {
int res = GetDateFormat( langid, 0, &sys_time, L"dddd", day_buf, 100 );
wcout << day_buf << endl;
sys_time.wDay++;
}
Таким образом можно получить список дней недели на нужном языке. Может есть способ попроще?

Комментировать в ВКонтакте