gpt4 book ai didi

c - strftime 强制在同一本地时区输出

转载 作者:行者123 更新时间:2023-11-30 15:26:58 28 4
gpt4 key购买 nike

我当前的计算机显示 CET 时间:

$ date
Mon Dec 1 21:31:41 CET 2014

但是我的区域设置是 en_US:

$ locale | grep -i time
LC_TIME="en_US.UTF-8"

我想用 C 将纪元字符串格式化为我当前的本地时区,但我不知道如何告诉 strptime 更改默认本地时区:

#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int
main(void)
{
struct tm tm;
char buf[255];

memset(&tm, 0, sizeof(struct tm));
strptime("1412200800", "%s", &tm);
strftime(buf, sizeof(buf), "%c %Z", &tm);
puts(buf);
exit(EXIT_SUCCESS);
}

手册页指出它根据区域设置格式化时间,但它似乎忽略了我的设置:

 $ export LC_TIME=de_DE.UTF-8
$ locale | grep -i time
LC_TIME=de_DE.UTF-8
$ ./a.out
Thu Oct 2 00:00:00 2014 CEST

我的期望是:

Wed Thu Oct  1 22:00:00 2014 CET

更新

好的,所以我完全删除了%s并尝试了以下方法,但仍然没有成功:

#define _XOPEN_SOURCE
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int
main(void)
{
struct tm *tim;
setlocale(LC_ALL, "");
char buf[255];
time_t c;

c = strtoul("1412200800", NULL, 0);
tim = localtime(&c);
strftime(buf, sizeof(buf), "%c" , tim);
puts(buf);
printf("%s %s\n", tzname[0], tzname[1]);
exit(EXIT_SUCCESS);
}

现在的输出仍然是我所期望的:

gcc strptime_test.c && ./a.out 
Thu 02 Oct 2014 12:00:00 AM CEST
CET CEST

更新2,解决方案:

我现在使用:而不是使用localtime(&c);:

tim = gmtime(&c);
strftime(buf, sizeof(buf), "%c" , tim);

这给出了所需的行为:

Wed 01 Oct 2014 10:00:00 PM GMT

最佳答案

您的代码正在使用 strptime 的非标准 glibc 扩展; %s 是自纪元以来的秒数。

根据Epoch Converter1412200800Wed, 01 Oct 2014 22:00:00 GMT,因此您的程序运行正常。但是,尚不清楚纪元秒是采用 UTC 还是您本地的时区,因此 loreb 在评论中指出,您可能还需要调用时区转换函数。

您必须决定程序中的时间(即 time_tstruct tm 对象的内容)是 UTC 时间还是本地时间。

我建议进行以下修复:将 strptime 替换为

time_t c = 1412200800;
tm = *gmtime(&c);

此处可能使用的另一个函数是 localtime,而不是 gmtime

<小时/>

顺便说一句,我认为您混淆了区域设置和时区:“区域设置”意味着时间的格式化方式;例如默认值可能是:

Sun Oct  1 00:00:00 2014

但区域设置格式的版本将是:

Sun, Oct 01, 2014 12:00:00 AM

时区和区域设置是不同的东西。 (一个区域设置可能跨越多个时区,一个时区可能包含多个区域设置)。

注意。在 C 语言中,默认语言环境是 C 语言环境,而不是系统语言环境。要从环境变量中读取语言环境,请执行以下操作:

#include <locale.h>

// in main()
setlocale(LC_ALL, "");

关于c - strftime 强制在同一本地时区输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27236921/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com