gpt4 book ai didi

c - 用 C 语言解析 tzdata 数据库的工具

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

如何解析tzdata数据库(由 IANA 或操作系统供应商发布)来获取历史时区信息?

例如,我想知道 Asia/Tokyo 与 GMT 的时间偏移是多少在特定时间点,例如 1435100000这实际上是 2015-04-25T22:13:20+00:00 (UTC)

最佳答案

您通常不需要自己解析数据文件来回答此类问题。

在大多数版本的 Unix 和 Linux 下,此程序将为您提供所需的时间偏移:

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

int main()
{
time_t t = 1435100000;
struct tm *tmp;
setenv("TZ", "Asia/Tokyo", 1);
tzset();
tmp = localtime(&t);
printf("offset = %ld\n", tmp->tm_gmtoff);
}

不幸的是,该程序所依赖的 tm_gmtoff 字段虽然非常有用,但却是非标准的。 (在某些版本的 Unix 下,它可能被命名为 _tm_gmtoff。在某些版本下,它可能根本不存在。)如果您没有可用的 tm_gmtoff,或者如果您需要为了使您的代码尽可能可移植,您可以使用以下技巧:

time_t t2;
tmp = gmtime(&t);
t2 = mktime(tmp);
printf("offset = %ld\n", t - t2);

对于 Unix、Linux、MacOS 以及使用 IANA 代码和数据的任何平台,此类程序应该能够给出自 1970 年 1 月 1 日以来任何时区和任何时间的正确结果。

对于 1970 年 1 月 1 日之前的时间,普通的 IANA 数据并不全面,因此如果您需要使用更早的日期和时间,则可能需要执行不同的操作。 (IANA 数据确实涵盖了 1970 年之前的时区规则,但不够全面,也没有声称是权威的。)

据我了解,Windows下的日期和时间代码不会保留历史时区信息,并且对于任何历史日期始终使用当年的规则,因此在Windows下您可能需要编写自己的代码,或者获取和编译 IANA 代码。 (但是您仍然不需要手动解析任何数据文件。)

关于c - 用 C 语言解析 tzdata 数据库的工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52002541/

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