标题
    
    
        [c/c++]妈妈呀,不同的时区 mktime 的结果是不同的!
    
 
    
 	 
       
    
    clq
    
    
    
		
        浏览(0) + 
        2008-05-22 15:43:59 发表
        
编辑
         
        
        
        
        关键字: 
        
 
        
        
        
        
                
        [c/c++]妈妈呀,不同的时区 mktime 的结果是不同的!
void CTool1Dlg::OnButton4() 
{
	tm tm2;
		
	memset(&tm2, 0, sizeof(tm));
	tm2.tm_year	= 70;
	tm2.tm_mon	= 0;
	tm2.tm_mday	= 1;
	tm2.tm_hour	= 8;//北京时间为 8 小时时差
	//不等于程序所在的时区的话,下面的 t2 永远不会是 0 ,小于当地时区的话就会返回 -1 也就是失败
	//也就是说 mktime 时按当地时间表示的 tm 结构来计算的!//但是又没有 gm_mktime 函数
	//不过可以用 gmtime() 和 localtime() 设计出一个时区无关的 gm_mktime 函数来
	time_t t2 = mktime(&tm2);	// TODO: Add your control notification handler code here
	t2 = 0;
	tm * tm3 = gmtime(&t2);//这个时候要用 gmtime ,因是看结果,结果是要用格林威治时间表示的//test 看结果对不对
	
}
        
        
        
        		
		        
                
                
     
    
 
	
	
     
    
       
    
    clq
    
    
    
    
    
    		    
    
          
              
    	这样就解决了.
//取得当前时区
int GetTimeZone()
{
	time_t t = 0;//time(NULL);
	tm * m = NULL;
	tm gtm;//格林威治
	tm ltm;//本地
	memset(>m, 0, sizeof(tm));
	memset(<m, 0, sizeof(tm));
	m = gmtime(&t);
	if (m == NULL) return 0;
	gtm = *m;
	m = localtime(&t);
	if (m == NULL) return 0;
	ltm = *m;
	int r = ltm.tm_hour - gtm.tm_hour;
	return r;
}
//mktime 是把 tm 中的时间当做本地时间来得到格林威治时间的,现在要把 tm 中的时间直接当做格林威治时间来算//算法上就是要加上时区的秒差
time_t gm_mktime(struct tm * m)
{
	time_t t = mktime(m);//这时的 t 是要少 8 个小时的,要加上8小时的时间//但对于其他国家来说怎么算出这个时差呢.
	//t = 8 * 60 * 60;
	int iTimeZone = GetTimeZone();
	t = iTimeZone * 60 * 60;
	return t;
}
void CTool1Dlg::OnButton4() 
{
	tm tm2;
		
	memset(&tm2, 0, sizeof(tm));
	tm2.tm_year	= 70;
	tm2.tm_mon	= 0;
	tm2.tm_mday	= 1;
	tm2.tm_hour	= 8;//北京时间为 8 小时时差
	//不等于程序所在的时区的话,下面的 t2 永远不会是 0 ,小于当地时区的话就会返回 -1 也就是失败
	//也就是说 mktime 时按当地时间表示的 tm 结构来计算的!//但是又没有 gm_mktime 函数
	//不过可以用 gmtime() 和 localtime() 设计出一个时区无关的 gm_mktime 函数来
	time_t t2 = mktime(&tm2);	// TODO: Add your control notification handler code here
	t2 = gm_mktime(&tm2);
	t2 = 0;
	tm * tm3 = gmtime(&t2);//这个时候要用 gmtime ,因是看结果,结果是要用格林威治时间表示的//test 看结果对不对
	
}
    
    
     
 
	 
	
    NEWBT官方QQ群1: 276678893
    可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
    但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
    验证问题说明申请入群原因即可.