c - 将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 代码完成脚本所做的任务。
解决方案
非便携式,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)。
推荐阅读
- java - Xubuntu:找不到命令“java”[已解决]
- javascript - 在同一台机器、不同端口上使用 Jenkins 和 Nginx Web App 解决 CORS
- c# - EzAPI - SSIS 设置 EzOleDbDestination 错误输出配置
- c# - 级联删除的软删除无法按预期工作
- c# - 无法使用 c# 根据来自 json 的 json 元素属性值验证数据条件
- javascript - 有条件地过滤依赖注入的异步数据?
- objective-c - 运行 BGProcessingTask 时无法解密 NSData
- c# - EF Core 上输入字段的默认值
- javascript - 这个 React 倒计时功能有效吗?
- python - Windows 阻止下载 python urllib