c - 如何使用当前区域设置打印日期?

标签 c linux date

我正在尝试在 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 设置被忽略了?

最佳答案

strftime 和所有其他与语言环境相关的函数默认使用“C”语言环境。为了使用用户区域设置,您必须显式调用 setlocale程序初始化期间的功能:

#include <locale.h>

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

    // ...
}

如果您将空字符串传递给 setlocale,那么它将根据标准区域设置环境变量(LC_ALL、LC_TIME 等)选择区域设置。

关于c - 如何使用当前区域设置打印日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30564743/

相关文章:

linux - 是否可以设置 'expect' 的退出代码

c++ - C++ 的数据库访问库

linux - 查找不包含搜索字符串的文件

vba - 让VBA转换不同的日期格式

shell - 日期转换不起作用

c - 使用 Contiki 测量时间(以时钟滴答为单位)

c++ - 为什么事件轮询循环中的函数触发频率低于其外部的函数

c - 在小于 O(n^2) - C 的未排序结构数组中查找重复元素

iphone - 有没有可以修改iphone系统时间的api?

c - 需要有关 C 中 lzss 压缩的帮助