【问题标题】:Convert the time string of UTC to IST time in C languageC语言将UTC时间字符串转换为IST时间
【发布时间】:2019-12-03 07:54:02
【问题描述】:

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

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

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

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

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 代码完成脚本所做的任务。

【问题讨论】:

  • struct tm 上进行时间/日期运算很麻烦。您真的要处理时、分、秒、日、月和年变化的所有界限,包括闰年和闰秒吗?不你不是!使用mktime 将值转换为time_t 并在那里进行算术运算。请注意,这仍然很棘手,因为您需要确定 DST 在目标时区是否有效。它仍然有点毛茸茸,但我记得几年前想出一个巧妙的技巧。不太记得我最后做了什么。
  • 如果 IST 是您的本地时间,您可以先转换为 time_t(如@paddy 的评论),然后使用localtime function 直接转换回来。如果不是,您可以先使用tzset function 调整时区。
  • 等一下,mktime 假设为local time!所以你需要先将UTC设置为当地时间!和 linux 一样,更好:timegm.

标签: c linux datetime time ctime


【解决方案1】:

非便携式,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();

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

如果您打算稍后恢复当前时区,您可以先使用getenv 检索当前时区,完整示例见timegm 文档。

现在可移植的方法是首先将时区设置为 UTC,调用 mktime 而不是 timegm,然后将时区设置为 IST 并调用 localtime,就像在非便携版本中一样,最后恢复本地时区(如果预期/需要,而您尚未通过将其设置为 IST 来这样做)。

【讨论】:

  • 您好,感谢您的回答。我尝试了便携式和非便携式方法将 UTC 时间转换为 IST。在本地机器(IST)中,两者都可以正常工作。但是,如果我在机器中使用本地时间作为 UTC 的代码,它不会返回有效的 IST 时间。相反,即使我将时区更改为 IST,它也会返回相同的 UTC 时间。在共享链接中,我添加了两个版本的代码 sn-p 并粘贴了输出。如果我遗漏了什么,请纠正我。 [1]drive.google.com/open?id=1BIwXQP3ZfklhlnZYLjCYsyzNCkdQVaSm
  • 首先,请注意您在其中一个函数中根本没有返回值,并且int 不适合保存time_t 类型的值,后者通常在大小比前者。除此之外,因为它似乎在一个系统上工作,我会检查另一个系统的时区设置。也许它没有配置为UTC,但仍然是IST,而是手动设置了5.5小时?
  • 嗨阿空加瓜,这是一个错误,将time_t 数据返回为int。我正在通过puts(s) 在函数中打印时间,因此无需考虑返回值。另外,我使用的是不同的机器(本地和 UTC)并且没有调整时间值。请在注释部分的共享代码底部找到测试用例。我已经更正了return 值:)
  • 时区字符串显然不正确; tzset 提供了适当的信息,应该是:IST-05:30:00(我提到你需要验证......),如果 IST 有夏令时(我不知道是否有),它必须明确指定(新西兰时间上面的链接示例:TZ="NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0")。说明见链接。
  • 如果有合适的时区文件,您可以询问 Google 支持,或者试试:Asia/Kolkata
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多