C 关于时间戳与时间的转化

查看:1026
本文介绍了C 关于时间戳与时间的转化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

时间戳与时间的相互转化,数据不对
时间戳1384936600对应的时间是2013-11-20-8:36:40 可是输出的是2013-11-20-3-36-40
时间2013-11-20-8:36:40对应的时间戳是1384936600,可是输出的是1384951000
不知道错在哪里

//时间转化成时间戳
long timeChange(stTIME_INFO* data){

time_t timep;    
struct tm p;    
p.tm_year=2013-1900;
p.tm_mon=11-1;
p.tm_mday=20;
p.tm_hour=8;
p.tm_min=36;
p.tm_sec=40;
/*p.tm_year=data->tm_year-1900;
p.tm_mon=data->tm_mon-1;
p.tm_mday=data->tm_mday;
p.tm_hour=data->tm_hour;
p.tm_min=data->tm_min;
p.tm_sec=data->tm_sec;*/
timep=mktime(&p);
printf("time%d\n",timep);
return timep;

}
//时间戳转化成时间
int stampChange(time_t timep,stTIME_INFO* data){

struct tm *p;
timep=1384936600;
printf("pppppstamp:%d\n",timep);
p=localtime(&timep); 
data->tm_year =p->tm_year+1900;
data->tm_mon =1+p->tm_mon;
data->tm_mday = p->tm_mday;
data->tm_hour =p->tm_hour;
data->tm_min =p->tm_min;
data->tm_sec =p->tm_sec;
data->tm_msec = 0;
printf("%d-%d-%d-%d-%d-%d\n",data->tm_year,data->tm_mon,data->tm_mday,data->tm_hour,data->tm_min,data->tm_sec);
timeChange(data);
return 0;

}

解决方案

时间戳1384936600对应的时间是2013-11-20 8:36:40+00:00啊。是UTC时间,localtime返回的是本地时间(北京时间)的tm。同样mktime是把tm当做本地时间计算时间戳。
如果你要求计算的都是UTC时间,gmtime可以返回UTC时间的tm。要想UTC的tm转换为时间戳稍微复杂一些:
调用tzset(),获取更新时区信息。
全局变量timezone存储的是当前时区和UTC偏差的秒数,在tm结构的秒数字段减去这个值。(秒数可能会变成负数)。
然后你mktime,它会自动纠正负数秒数,计算正确的日期。

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

int main()
{
    struct tm sttime;
    time_t timenow, timenow2;
    char buff[80];
    // 获取时区信息
    tzset();
    // 时间戳转 UTC 时间
    time(&timenow);
    sttime = *gmtime(&timenow);  
      
    strftime(buff, sizeof(buff), "%Y-%m-%d %H:%M:%S", &sttime);
    printf("UTC time: %s\n", buff);

    // UTC 时间转时间戳
    sttime.tm_sec -= timezone;
    timenow2 = mktime(&sttime);  // tm 结构也会自动修正

    strftime(buff, sizeof(buff), "%Y-%m-%d %H:%M:%S", &sttime);
    printf("Local time: %s %s\n", buff, tzname[0]);
    printf("Unix time: %d", timenow2);

    return 0;
}

另外建议你把夏令时那个字段设置为0,或者直接memset清空tm。

这篇关于C 关于时间戳与时间的转化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆