Как получить отформатированную дату и время для текущей локали в C?

Какую функцию C следует вызвать, чтобы получить отформатированную дату и время для локали, в которой выполняется программа?

Я задаю этот вопрос, потому что столкнулся с проблемой при использовании API демона ClamAV. Команда VERSION возвращает дату и время последних описаний вирусов, но код использует вызов ctime для форматирования. Насколько я могу судить, ctime не форматирует дату и время в соответствии с текущей локалью и использует английские сокращения для дней недели и месяца в возвращаемой строке. Это вызывает проблемы, поскольку моя Java-программа, использующая ClamAV API, действительно учитывает текущую локаль и, таким образом, ожидает, что день недели и название месяца будут иметь местные сокращения.

Формат даты и времени должен быть в том же формате, что и ctime:

Www Ммм дд чч:мм:сс гггг

Где Www — день недели, Mmm — месяц буквами, dd — день месяца, hh:mm:ss — время, а yyyy — год.

Я мог бы переписать Java-программу, чтобы всегда использовать английские даты, но я был бы счастлив отправить исправление в ClamAV, поскольку мне это кажется ошибкой на их стороне.


person jwaddell    schedule 06.05.2010    source источник
comment
да, ctime не создает локализованную строку даты/времени, он вызывает asctime, который создает строку в формате США, но почему вы считаете, что это ошибка? Я думаю, что если есть какая-то утилита для анализа строки даты/времени для сравнения дат, было бы проще сохранить один формат (хотя числовая версия была бы лучше).   -  person AndersK    schedule 06.05.2010
comment
Но это означает, что все пользователи ClamAV API, использующие неамериканские локали, должны специально анализировать дату, используя локаль США. Это достаточно просто сделать на Java, но может быть сложно на других языках? Делать это вручную было бы утомительно, особенно если вы не говорите по-английски и вам приходится искать все названия и аббревиатуры.   -  person jwaddell    schedule 06.05.2010
comment
При этом я, вероятно, изменю наш код, а также отправлю отчет об ошибке/исправление и посмотрю, что скажут разработчики ClamAV.   -  person jwaddell    schedule 06.05.2010
comment
Было бы лучше, если бы ClamAV API предоставлял дату/время в независимом от локали формате - как старая добрая временная метка эпохи UNIX.   -  person caf    schedule 06.05.2010
comment
@caf определенно, но я думаю, что они думали о том, что люди звонят ему через telnet и хотят, чтобы он был удобочитаемым.   -  person jwaddell    schedule 06.05.2010
comment
Поскольку текущая команда VERSION не принимает никаких аргументов, вы можете добавить необязательный аргумент tsformat=UNIX или аналогичный.   -  person caf    schedule 06.05.2010


Ответы (1)


strftime("%c", ... должно дать вам предпочтительное представление даты и времени для текущей локали. Или (все еще с strftime) вы можете эмулировать формат ctime, но с %b для сокращения месяца в текущем регионе, %a для сокращения дня недели в текущем регионе и так далее.

person Alex Martelli    schedule 06.05.2010