#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. Сейчас на работе, вечером попробую проверить на работоспособность.
Комментариев нет:
Отправить комментарий