Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
将UTC日期和时间转换为UNIX时间会给出错误的(时区不同)值。为什么?_C_Utc_Epoch - Fatal编程技术网

将UTC日期和时间转换为UNIX时间会给出错误的(时区不同)值。为什么?

将UTC日期和时间转换为UNIX时间会给出错误的(时区不同)值。为什么?,c,utc,epoch,C,Utc,Epoch,我编写了一个小函数,将UTC中的日期和时间转换为UNIX时间(大纪元时间)。然而,我得到的值取决于我所在的时区 这是密码 #include<stdio.h> #include<time.h> time_t GenerateUnixTimeStampFromDateAndTime(char *DateAndTime); void main() { long int UnixTime=0; char *CurrentTime="01/22/2019 06:

我编写了一个小函数,将UTC中的日期和时间转换为UNIX时间(大纪元时间)。然而,我得到的值取决于我所在的时区

这是密码

#include<stdio.h>
#include<time.h>

time_t GenerateUnixTimeStampFromDateAndTime(char *DateAndTime);

void main()
{
    long int UnixTime=0;
    char *CurrentTime="01/22/2019 06:30:00";

    UnixTime = (long int)GenerateUnixTimeStampFromDateAndTime(CurrentTime);
    printf("Current Unix Time= %ld\r\n", UnixTime);
}

time_t GenerateUnixTimeStampFromDateAndTime(char *DateAndTime) 
{
    struct tm ti={0};
    if( sscanf(DateAndTime, "%d/%d/%d %d:%d:%d", &ti.tm_mon, &ti.tm_mday, &ti.tm_year, &ti.tm_hour, &ti.tm_min, &ti.tm_sec) != 6 )
        return -1;
    ti.tm_year = ti.tm_year - 1900;
    ti.tm_mon = ti.tm_mon - 1;

    return mktime(&ti);
}
#包括
#包括
time_t GenerateUnixTimeStampFromDateAndTime(字符*日期和时间);
void main()
{
long int UnixTime=0;
char*CurrentTime=“01/22/2019 06:30:00”;
UnixTime=(long int)GenerateUnixTimeStampFromDateAndTime(CurrentTime);
printf(“当前Unix时间=%ld\r\n”,UnixTime);
}
时间\u t生成NixTimestampFromDateAndTime(char*DateAndTime)
{
struct tm ti={0};
如果(sscanf(日期和时间,“%d/%d/%d%d:%d:%d”、&ti.tm\u-mon、&ti.tm\u-mday、&ti.tm\u-year、&ti.tm\u-hour、&ti.tm\u-min、&ti.tm\u-sec)!=6)
返回-1;
ti.tm_年=ti.tm_年-1900年;
ti.tm_-mon=ti.tm_-mon-1;
返回mktime(&ti);
}
我得到的答案是1548118800,即2019年1月22日01:00:00,即-5:30,这是我所在的时区(印度)。如果我将我的电脑时区更改为UTC,那么它给出的正确值为1548138600

我需要做哪些更改才能使其独立于时区?

如文件所述,采用本地时间的细分时间组件

首先,保存用户当前时区:

char  *old_timezone, *temp;

temp = getenv("TZ");
if (temp) {
    const size_t  len = temp;
    old_timezone = malloc(len + 1);
    if (!old_timezone) {
        fprintf(stderr, "Out of memory!\n");
        exit(EXIT_FAILURE);
    }
    if (len > 0)
        memcpy(old_timezone, temp, len);
    old_timezone[len] = '\0';
} else
    old_timezone = NULL;
如果用户使用系统默认值,
old_时区
将为空

接下来,将当前时区(对于此过程)设置为UTC:

请注意,如果需要,可以使用任何时区说明符,而不是上面的
“UTC”
;有关详细信息,请参阅。
tzset()
调用通常由您的C库在内部完成,但是在这里显式地执行它可以帮助我们看到特定于时区的事情刚刚发生

此时,
mktime()
将以UTC运行,
localtime()
gmtime()
将返回相同的结果

然后,通过以下方式恢复时区:

if (old_timezone) {
    setenv("TZ", old_timezone, 1);
    free(old_timezone);
    old_timezone = NULL;
} else
    unsetenv("TZ");
tzset();
请注意,这不会影响除当前进程(以及通过
popen()
system()
fork()
exec()
创建的任何子进程)以外的任何进程。时区和区域设置一样,是每个进程的属性


运行

    unsetenv("TZ");
    tzset();
将此进程的当前时区更改为系统默认时区


如果您的程序以UTC显式运行,您只需

    /* This program works explicitly in the UTC timezone.
       User/system timezone configuration is completely ignored. */
    setenv("TZ", "UTC", 1");
    tzset();

main()

的开头附近,将LC\U时间区域设置设置为“UTC”。@KamilCuk这是操作系统级命令还是c代码级命令?
    /* This program works explicitly in the UTC timezone.
       User/system timezone configuration is completely ignored. */
    setenv("TZ", "UTC", 1");
    tzset();