// 格林威治时间转换为北京时间(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);
if( 1 == m )

{
y --;
m = 13;
}
else if( 2 == m )

{
y --;
m = 14;
}

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

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