C:如何在特定时区(通过偏移)打印特定的“时间”值?

C:如何在特定时区(通过偏移)打印特定的“时间”值?,第1张

概述我正在用C语言编写一个解析由外部程序记录的数据文件的应用程序(我无法控制).它存储二进制数据,其中一个字段是标准UNIX“纪元”格式的时间(自1970年1月1日起的秒数,UTC). 另一个字段是时区,存储为UTC的秒数偏移量. 很酷,我已经拥有了所需的一切,可以在记录的时区内制作一个日期/时间字符串来表示该信息,对吗?嗯……它似乎不是这样,和/或我不知道该怎么做. 我把事情简化为一个相当简单的测试 我正在用C语言编写一个解析由外部程序记录的数据文件的应用程序(我无法控制).它存储二进制数据,其中一个字段是标准UNIX“纪元”格式的时间(自1970年1月1日起的秒数,UTC).

另一个字段是时区,存储为UTC的秒数偏移量.

很酷,我已经拥有了所需的一切,可以在记录的时区内制作一个日期/时间字符串来表示该信息,对吗?嗯……它似乎不是这样,和/或我不知道该怎么做.

我把事情简化为一个相当简单的测试用例:

#include <stdio.h>#include <time.h>int main(voID){    time_t t;    struct tm *tm;    char buf[BUFSIZ];    int offset = 4980; /* slightly bizarre,just to test this - an hour                        * and 23 minutes ahead of UTC */    t = time(NulL);    tm = localtime(&t);    strftime(buf,BUFSIZ,"%FT%T%z",tm);    printf("before: %s\n",buf);    /* since we're not telling localtime anything different,* compensate here (by subtracting applIEd offset,and adding     * desired one): */    t += offset - tm->tm_gmtoff;    tm = localtime(&t);    tm->tm_zone = "XYZ"; // not used -- but it was in an earlIEr version    tm->tm_gmtoff = offset;    // on macos,I used to also have %+,which referenced tm_zone    strftime(buf,tm);    printf("after:  %s\n",buf);    return 0;}

当我在MacOS X 10.6上运行它时,我得到:

before: 2011-02-23T00:53:04-0800after:  2011-02-23T10:16:04-0800

我期望的(事实上,在linux机器上获得)将是:

before: 2011-02-23T00:53:04-0800after:  2011-02-23T10:16:04+0123

我是否需要更改TZ环境变量(也许可以调用tzset)?似乎应该有一种方法来 *** 纵数据结构并获得正确的东西,但上述肯定是行不通的(无论如何,在MacOS X 10.6上 – 在linux上运行良好).

作为一种解决方法,我想我可以从格式字符串中删除%z并自己创建该部分.

理想情况下,我想要修改我的struct tm,或者我可以使用的其他一些函数调用(比如strftime,但是使用额外的参数或其他东西,或者可能是替代形式的localtime),这将使事情做正确的事情.

因为linux似乎表现得很好(虽然在那里,上面的解决方案并不是很理想,因为我捏造了我的time_t值;我更喜欢有一个参数来改变struct tm的计算方式),这是什么我应该报告对MacOS的错误?

或者,是否有一组我可以调用的不同的库例程,即使最终需要第三方(来自GNU伙伴,我想象的)库?我宁愿保留C,但我会考虑ObjC或C选项.

解决方法 我更喜欢使用mktime()而不是修改time_t值.但是,这会应用TZ偏移量(就像localtime()解决方案一样),因此需要mkgmtime()实现.

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>static voID set_timezone(char *tz){  static char var[1024];  snprintf(var,sizeof(var),"TZ=%s",tz);  putenv(var);  tzset();}static time_t mkgmtime(struct tm *tm){  char var[1024];  time_t t;  snprintf(var,"%s",getenv("TZ") ? getenv("TZ") : "");  set_timezone("GMT0");  t = mktime(tm);  set_timezone(var);  return t;}int main(voID){  time_t t;  struct tm tm;  char buf[BUFSIZ];  int offset = 4980; /* slightly bizarre,just to test this - an hour                      * and 23 minutes ahead of UTC */  t = time(NulL);  tm = *localtime(&t);  strftime(buf,&tm);  printf("before: %s\n",buf);  tm = *gmtime(&t);  tm.tm_sec += offset;  mkgmtime(&tm);  strftime(buf,&tm);  printf("after:  %s\n",buf);  return 0;}
总结

以上是内存溢出为你收集整理的C:如何在特定时区(通过偏移)打印特定的“时间”值?全部内容,希望文章能够帮你解决C:如何在特定时区(通过偏移)打印特定的“时间”值?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225399.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存