首页 > 解决方案 > 将UTC的时间字符串转换为C语言的IST时间

问题描述

我正在寻找 C 程序中的 UTC(从 RFC3339 格式)到 IST 转换。但我找不到任何通用的方法来转换时间。

在这里,我找到了将 UTC 时间(RFC3339 格式)转换为 IST 的 shell 脚本,我正在尝试用 C 代码实现。

从脚本中,我找不到 newdate=$(TZ=IST date -d "$formatT UTC-5:30")C 代码中语句的等效方式。

所以,我做了-5:30与 GMT 时间的时间差异,如下面的片段所示。但是,它没有按预期工作。

int main(int argc, char *argv[])
{  
    const char *utctime = "2019-07-24T11:47:33";
    struct tm tm = {0};
    char s[128] = {0};

    if (NULL == (strptime(utctime, "%Y-%m-%dT%H:%M:%S", &tm))) {
        printf("strptime failed\n");
    }

    printf("IST Time : %2d:%02d\n", ((tm.tm_hour-5)%24), tm.tm_min-30);

}

请指导我用 C 代码完成脚本所做的任务。

标签: clinuxdatetimetimectime

解决方案


非便携式,Linux:

struct tm time;
// fill appropriately

time_t utc = timegm(&time)

localtime_r(&utc, &time);

如果您的本地时区不是 IST,则需要在调用本地时间之前更改为:

setenv("TZ", "IST-05:30:00", 1);
//             ^ not entirely sure if this is correct, please verify yourself (*)

tzset();

编辑(根据评论):(*)特别是如果必须应用夏令时(DST),时区字符串看起来不同;您可以在tzset 文档中找到有关信息。可能服务器在本地文件中提供时区信息,那么您也可以尝试:Asia/Kolkata

getenv如果您打算在之后恢复当前时区,您可以先检索当前时区,完整的示例显示在timegm文档中。

现在可移植的方法是首先将时区设置为 UTC,调用mktime而不是timegm,然后将时区设置为 IST 并localtime像在非便携式版本中一样调用,最后恢复本地时区(如果打算/需要并且您还没有这样做)将其设置为 IST)。


推荐阅读