C 将人类可读的日期转换为GMT日期
我有一个人类可读的日期,是在当地时间。我需要将人类可读的时间转换为人类可读形式的GMT时间 我的可读日期是2014年3月30日02:59 当我将时间转换为格林尼治标准时间时,我预计时间为30日01:59,但我的转换结果仍然是2:59 我相信转换的唯一方法是将人类时间转换成一个时代,然后再转换回gmtime,但这样做我仍然得到2:59 下面是我正在使用的代码:C 将人类可读的日期转换为GMT日期,c,C,我有一个人类可读的日期,是在当地时间。我需要将人类可读的时间转换为人类可读形式的GMT时间 我的可读日期是2014年3月30日02:59 当我将时间转换为格林尼治标准时间时,我预计时间为30日01:59,但我的转换结果仍然是2:59 我相信转换的唯一方法是将人类时间转换成一个时代,然后再转换回gmtime,但这样做我仍然得到2:59 下面是我正在使用的代码: struct tm t; struct tm *gmtTimeStruct; time_t t_of_day; i
struct tm t;
struct tm *gmtTimeStruct;
time_t t_of_day;
int year = atoi(date);
int month = atoi(date+5);
int day = atoi(date+8);
int hour = atoi(time);
int minutes = atoi(time+3);
char * gmtHumanTime = NULL;
printf("Year: %i Month: %i Day: %i Hour: %i Minutes: %i\n", year, month, day, hour, minutes);
t.tm_year = year - 1900;
t.tm_mon = month - 1;
t.tm_mday = day;
t.tm_hour = hour;
t.tm_min = minutes;
t.tm_sec = 59;
t.tm_isdst = 0;
t_of_day = mktime(&t);
printf("Epoch time: %ld\n", t_of_day);
gmtTimeStruct = gmtime(&t_of_day);
asprintf(&gmtHumanTime, "%s:%s", gmtTimeStruct->tm_hour, gmtTimeStruct->tm_min);
printf("GMT Human Time: %s", gmtHumanTime);
更新1
我还尝试将t.tm_isdst标志从0,1和-1更改,以查看是否有任何更改,但似乎没有。我知道mktime与此标志有问题,因为它无法始终确定时间是否因DST而需要延长,但我不确定timegm是否存在相同的问题 这是你的问题:
如果夏令时生效,则夏令时标志(tm_isdst)大于零;如果夏令时未生效,则为零;如果信息不可用,则小于零
通过设置t.tm_isdst=0代码>在代码中,您明确指定日光节约不生效。您应该提供一个负值
参考:
(另外,底部附近的格式字符串不应该是%d:%02d”
而不是%s:%s”
?)
编辑
抱歉,我没有注意到您尝试了不同的tm_isdst
值。如果您稍微简化一下代码,可能会有所帮助。这在我的系统上非常有效:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
struct tm t, *gmtTimeStruct, *localTimeStruct;
time_t t_of_day;
char *gmtHumanTime, *localHumanTime;
t.tm_year = 2014 - 1900;
t.tm_mon = 3 - 1;
t.tm_mday = 30;
t.tm_hour = 2;
t.tm_min = 59;
t.tm_sec = 59;
t.tm_isdst = -1;
t_of_day = mktime(&t);
gmtTimeStruct = gmtime(&t_of_day);
asprintf(&gmtHumanTime, "%d:%d", gmtTimeStruct->tm_hour, gmtTimeStruct->tm_min);
printf("GMT Human Time: %s\n", gmtHumanTime);
localTimeStruct = localtime(&t_of_day);
asprintf(&localHumanTime, "%d:%d", localTimeStruct->tm_hour, localTimeStruct->tm_min);
printf("Local Human Time: %s\n", localHumanTime);
return 0;
}
试着在你的系统上编译一下,看看你得到了什么。(也许您的系统时区设置有问题?了解&我不认为这些解决了我遇到的问题,除非我遗漏了什么我现在在英国,所以GMT和服务器一样,我的TZ应该不重要,因为我不是在看我传入日期和时间的当前时间吗?我会使用strtime
,然后localtime
,然后gmtime
,然后strtime
谢谢,我之前确实更新了我的问题,说我已经尝试将isdst标志设置为0/1/-1,但它们都没有区别,我仍然总是得到2:59。底部附近的输出只是调试,一旦它的工作状态正常,它就不会在那里了,我看到的唯一问题是mktime与isdst的-1标志集一起使用。我知道这有一个问题,如果时间是10月的早上,时钟会在1点半左右变化。mktime不知道它是在时钟改变前的半个1还是在时钟改变后的半个1,所以我可能会出错result@Boardy这种模棱两可肯定是不可避免的?
GMT Human Time: 1:59
Local Human Time: 2:59