2015-06-01 1 views
0

Я пытаюсь написать программу на Linux, которая печатает текущую дату. Здесь, в Бразилии, я хочу, чтобы он печатался в формате dd/mm/yyyy, а в США он печатался в формате mm/dd/yyyy.Как распечатать дату, используя текущие настройки локали?

Я думал, что спецификатор «% x» для strftime должен был сделать трюк, но его печать в формате mm/dd/yyyy.

#include <stdio.h> 
#include <time.h> 

int main(){ 

    struct tm local_now; 
    { 
    time_t now; 
    time(&now); 
    struct tm *tmp = localtime(&now); 
    local_now = *tmp; 
    } 

    char buf[20]; 
    strftime(buf, sizeof buf, "%x", &local_now); 

    printf("%s\n", buf); 

    return 0; 
} 

А вот выход я получаю от запуска команды locale:

LANG=en_US.UTF-8 
LANGUAGE=en_US 
LC_CTYPE="en_US.UTF-8" 
LC_NUMERIC=pt_BR.UTF-8 
LC_TIME=pt_BR.UTF-8 
LC_COLLATE="en_US.UTF-8" 
LC_MONETARY=pt_BR.UTF-8 
LC_MESSAGES="en_US.UTF-8" 
LC_PAPER=pt_BR.UTF-8 
LC_NAME=pt_BR.UTF-8 
LC_ADDRESS=pt_BR.UTF-8 
LC_TELEPHONE=pt_BR.UTF-8 
LC_MEASUREMENT=pt_BR.UTF-8 
LC_IDENTIFICATION=pt_BR.UTF-8 
LC_ALL= 

Видимо установка LC_TIME=pt_BR.UTF-8 игнорируется?

+1

http://www.gnu.org/software/libc/manual/html_node/Setting-the-Locale.html команда setlocale - ваш друг. Вы не можете это назвать? Кроме того, ваш язык - это смесь. –

+0

jim, вы должны преобразовать это в ответ :) Я не знал о setlocale. BTW, теперь он печатает '31-05-2015'. Есть ли простой способ использовать косые черты вместо тире или это будет слишком много проблем? – hugomg

+1

Я бы использовал «% d /% m /% Y» в качестве формата для strftime (или любого другого порядка, который соответствует вашим потребностям). –

ответ

1

strftime и все другие функции, зависящие от локали, по умолчанию используют «C». Для того, чтобы использовать пользователи локали вы должны явно вызвать функцию setlocale во время инициализации программы:

#include <locale.h> 

int main() { 
    setlocale(LC_ALL, ""); 

    // ... 
} 

Если передать пустую строку setlocale, то он выберет локаль в соответствии с переменными стандартной языковой среды (LC_ALL, LC_TIME и т. Д.).

Смежные вопросы