gpt4 book ai didi

c - 如何轻松添加 gmtime 的小时和分钟

转载 作者:行者123 更新时间:2023-11-30 18:22:43 25 4
gpt4 key购买 nike

是否有一种预定义的方法可以将小时和分钟添加到通过 time.h 获取的 gmtime 中?我想编写一个程序来显示各个国家的时间,那么我必须自己编写逻辑还是有预定义的方法?

最佳答案

如果您有时区名称(例如 Europe/HelsinkiUS/EasternMST),则有一个非常简单的 POSIX界面。

它确实为整个进程应用时区,因此如果您使用线程,则需要包装日期/时间函数以避免并发日期/时间访问,除非它们使用相同的时区,例如使用互斥体。为了使示例更容易理解,此处显示的示例不是线程安全的。

首先,将环境变量 TZ 设置为以冒号为前缀的时区名称。这是 POSIX 系统中用于为各个进程设置时区的方法(并影响进程中的所有线程)。例如,

setenv("TZ", ":Europe/Helsinki", 1);

设置赫尔辛基时区。请参阅man 3 setenv了解详情。仅此还不够;您还必须通过调用告诉 C 库更新当前时区

tzset();

然后,您可以检查全局变量 tzname[0](应包含 Europe)和 tzname[1](应包含赫尔辛基)来查看实际设置的时区。请参阅man 3 timezone了解更多详情;你可以例如使用 POSIX 时区定义语法来指定自定义时区。

在上面两行之后,每当您使用 localtime() 时或 localtime_r(),应用选定的时区。就这么简单。

<小时/>

如果您还希望更改时间戳的格式以符合特定的区域设置,您可以通过设置区域设置(例如,fi_FI.utf8)

setlocale(LC_TIME, "fi_FI.utf8");

注意,如 man 3 setlocale手册页说,区域设置必须采用规范格式,像 fi 这样的短格式将不起作用。然后,使用例如

time_t     now_time;
struct tm *now_tm;
char *format;
char buffer[256];
size_t length;

time(&now_time);
now_tm = localtime(&now_time);
if (!now_tm) {
/* Error, cannot get local time corresponding to now_time! */
return -1;
}

format = nl_langinfo(D_T_FMT);
if (!format || !*format) {
/* Error, cannot get date-time formatting string for this locale */
return -1;
}

/* Note: both now_tm and format point to static buffers,
* and they will be overwritten by subsequent calls.
*/

length = strftime(buffer, sizeof buffer, format, now_tm);
if (length < 1 || length >= sizeof buffer) {
/* Error in locale configuration; cannot generate date-time string. */
return -1;
}

此时 buffer 包含芬兰语日期和时间(或在最后一个 setlocale(LC_TIME, locale) 调用中设置的任何区域设置),采用芬兰时区 (或上次 setenv("TZ", ":Europe/Helsinki", 1); tzset(); 调用) 中设置的任何时区。

(最后的length检查向后兼容一些非常旧的系统,如果缓冲区太小,则返回sizeof buffer。较新的系统在缓冲区太小时返回该值。足够大,但我希望 256 字节足以满足任何语言的时间和日期。)

我想指出这一点,因为在类 POSIX 系统中,区域设置(语言和格式)和时区是完全分开的。

关于c - 如何轻松添加 gmtime 的小时和分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15929915/

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