我的人类可读日期是当地时间。我需要以人类可读的形式将这个人类可读时间转换为GMT时间。
我的人类可读日期是30th March 2014 02:59
。
当我将时间转换为GMT时,我预计时间是30日01:59,但我的转换仍然是2:59。
我认为进行转换的唯一方法是将人类时间转换为时代,然后将其转换回gmtime,但这样做我仍然得到2:59。
以下是我正在使用的代码:
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
我也尝试从0,1和-1更改t.tm_isdst标志以查看是否有任何更改,但似乎没有。我知道mktime有这个标志的问题,因为它不能总是计算时间是否需要由于DST而修改但是我不确定timegm是否有相同的问题。
答案 0 :(得分:2)
这是你的问题:
如果夏令时生效,则夏令时标志(tm_isdst)大于零,如果夏令时无效则为零,如果信息不可用则小于零。
通过在代码中设置t.tm_isdst = 0;
,您明确指出没有夏令时生效。你应该提供一个负值。
参考:http://www.cplusplus.com/reference/ctime/tm/
(另外,底部附近的格式字符串不应该是"%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 Human Time: 1:59
Local Human Time: 2:59
尝试在您的系统上进行编译,看看您得到了什么。 (也许系统的时区设置有问题?)