2015-06-01 55 views
0

我想在Linux上编写一个打印当前日期的C程序。在巴西,我希望它以dd/mm/yyyy格式打印,而在美国则以mm/dd/yyyy格式打印。如何使用当前区域设置打印日期?

我认为strftime的“%x”说明符本来是要做的,但它的打印格式为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

吉姆,你应该将其转换为答案:)我不知道关于setlocale。顺便说一句,它现在印刷'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等)。

相关问题