将人类可读日期转换为GMT日期

时间:2014-11-25 11:15:07

标签: c

我的人类可读日期是当地时间。我需要以人类可读的形式将这个人类可读时间转换为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是否有相同的问题。

1 个答案:

答案 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

尝试在您的系统上进行编译,看看您得到了什么。 (也许系统的时区设置有问题?)