Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将人类可读的日期转换为GMT日期_C - Fatal编程技术网

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

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

我有一个人类可读的日期,是在当地时间。我需要将人类可读的时间转换为人类可读形式的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;
    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