导航

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

随笔分类

随笔档案

文章档案

相册

2008年4月27日

 

// 格林威治时间转换为北京时间(2000年以后)
// 输入参数 年(2位),月,日,时,分,秒
void Calc( int y, int m, int d, int hh, int mm, int ss )
{
    
int w;        // 星期
    hh += 8;    // 格林威治时间 + 8 小时 = 北京时间

    
if( hh < 24 )    goto l_out;        // 没有跨天,则计算完成

    
///////////// 下面是跨天后的计算 /////////////////////////////
    hh -= 24;
    d 
++;        // 日期加一天

    
switch( m )        // 按月判断
    {
    
case 4:        case 6:                // 跨小月的判断
    case 9:        case 11:
        
if( d > 30 )
        
{
            d 
= 1;    m ++;
        }

        
break;

    
case 1:        case 3:                // 跨大月的判断
    case 5:        case 7:
    
case 8:        case 10:
        
if( d > 31 )
        
{
            d 
= 1;    m ++;
        }

        
break;

    
case 12:                        // 12 月,要判断是否跨年
        if( d > 31 )
        
{
            y 
++;    d = 1;    m = 1;
        }

        
break;

    
case 2:                            // 2 月,要判断是否是闰年
        if( ( (y+2000)%400 == 0 ) ||                        // 能被400整除,一定是闰年
            ( (y+2000)%4 ==0 ) && ( (y+2000)%100 !=0 ) )    // 能被4整除,但不能被100整除,一定是闰年
        {
            
if( d>29 )    // 闰年2月,可以有29号
            {
                m 
= 3;    d = 1;
            }

        }

        
else if( d>28 )    // 非闰年2月,可以有28号
        {
            m 
= 3; d = 1;
        }

        
break;
    }


l_out:    
// 计算完成,开始输出
    printf( "%04d.%02d.%02d - %02d:%02d:%02d", y+2000, m, d, hh, mm, ss);
    
if1 == m )
    
{
        y 
--;
        m 
= 13;
    }

    
else if2 == m )
    
{
        y 
--;
        m 
= 14;
    }


    w 
= y + y/4 + 26 * ( m + 1 ) / 10 + d - 1;
    w 
%= 7;        // 0 表示星期日

    printf ( 
" week=%d ", w );
}
发表于 2008-04-27 22:54 杨老师的茅屋 阅读(1275) | 评论 (4)编辑 收藏

统计