Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Как узнать, с какого дня начинается неделя для текущей локали системы?

#c #дата #кроссплатформенность #локаль


Требуется вывести в консоль календарь на месяц, для чего необходимо знать день, с
которого начинается неделя. В С в структуре времени по умолчанию день недели хранится
в формате 0-6, где 0 = воскресенье. Интересует независимость от платформы для данного
приложения. Как корректно получить системную локаль и узнать первый день недели для нее?
Возможно есть сторонняя кроссплатформенная библиотека или же придется делать под
API разных систем?
Сделать нужно на чистом С.    


Ответы

Ответ 1



Узнать название текущей локали - setlocale(LC_ALL,NULL);. Вместо LC_ALL Вам может быть лучше взять LC_TIME. Environment's default locale - setlocale(LC_ALL,""); Параметры текущкй локали - struct lconv *curloc = localeconv();. Подробности в locale.h По идее Вам надо вызвать setlocale(LC_TIME,""); и использовать localtime(), но в реальной жизни проблема в том, что локаль часто новрмально не настроена.

Ответ 2



Вот дурь, честное слово. Я тут провел маленькое исследование и выяснил, что нужно тогда поддерживать возможность указать ЛЮБОЕ начало недели. Например, в некоторых странах неделю начинают с субботы (!). Так сделано у арабов. Но они и пишут своей вязью справа налево, да? А завтра в какой-нибудь Камбодже примут стандарт, что будут считать недели со среды и что тогда делать!? по вопросу - в Си (голом) я не нашел возможности узнать с какого дня начинается неделя, да и нужно ли это действительно? Может проще сделать по-другому? Например, просто занести в конфигурационный файл программы возможность изменения этой опции или автодетект по типу локали (US -> начинаем с ВС, RU -> начинаем с ПН). Я даже табличку соответствий по странам нашел: И самое главное - проверить в какой стране (локали) мы находимся можно через переменную окружения LANG. А ее можно вычитать через extern char * *__environ; Либо использовать ф-цию getenv()

Ответ 3



Очень интересный вопрос, на который, признаться, с ходу ответа не имел. Поиск дал решение для POSIX-систем, основанное на применении фукнции nl_langinfo: пост форума источника, man. Сейчас на работе, вечером попробую проверить на работоспособность.

Комментариев нет:

Отправить комментарий