#include "utc2local.h"
#include "windows.h"
static const unsigned short days2MonthNormal[12] = {
31,//1
31+28,//2
31+28+31,//3
31+28+31+30,//4
31+28+31+30+31,//5
31+28+31+30+31+30,//6
31+28+31+30+31+30+31,//7
31+28+31+30+31+30+31+31,//8
31+28+31+30+31+30+31+31+30,//9
31+28+31+30+31+30+31+31+30+31,//10
31+28+31+30+31+30+31+31+30+31+30,//11
31+28+31+30+31+30+31+31+30+31+30+31,//12
};
static const unsigned short days2MonthRun[12] = {
31,//1
31+29,//2
31+29+31,//3
31+29+31+30,//4
31+29+31+30+31,//5
31+29+31+30+31+30,//6
31+29+31+30+31+30+31,//7
31+29+31+30+31+30+31+31,//8
31+29+31+30+31+30+31+31+30,//9
31+29+31+30+31+30+31+31+30+31,//10
31+29+31+30+31+30+31+31+30+31+30,//11
31+29+31+30+31+30+31+31+30+31+30+31,//12
};
unsigned char IsRunNian(unsigned int year)
{
//初步判定为闰年.100不闰,400年又闰
if ( year % 4 )
return 0;
if ( year % 100 )
return 1;
//100不闰,因此要进一步判定
if ( year % 400 )
return 0;
else
return 1;
}
void Utc2LocalTime(unsigned int TIME,P_LOCAL_TIME pTime)
{
/*************************************************
* 1970.01.01.THURs
*
*/
int i;
// unsigned int hours;
// unsigned int minutes;
// unsigned int seconds;
unsigned int days;
unsigned short year = 1970;
if (pTime == NULL)
{
return;
}
pTime->Second = (TIME % 60); //得到秒余数
TIME = (TIME / 60); //得到整数分钟数
pTime->Minute = (TIME % 60); //得到分钟余数
TIME = (TIME / 60); //得到整数小时数
pTime->Hour = (TIME % 24 ); //得到小时余数
days = TIME = ( TIME / 24 ); //转换为整数天数
pTime->DayOfWeek = (4+(days%7))%7;
while ( days>365 )
{
if(IsRunNian(year))
days--;
days -= 365;
year++;
}
//now days <= 365
if (!IsRunNian(year) && (days== 365) )
{
year++;
pTime->Month = 1;
pTime->Date = 1;
pTime->Year = year;
return;
}
pTime->Year = year;
//here days <365
if (IsRunNian(year)){
for (i=0;i<12;i++){
if (days < days2MonthRun[i]){
pTime->Month = i+1;
if (i == 0){
pTime->Date = days;
}else{
pTime->Date = days-days2MonthRun[i-1];
}
pTime->Date++;
return ;//<--------------------------------
}
}
}else{
for (i=0;i<12;i++){
if (days < days2MonthNormal[i]){
pTime->Month = i+1;
if (i == 0){
pTime->Date = days;
}else{
pTime->Date = days-days2MonthNormal[i-1];
}
pTime->Date++;
return ;//<--------------------------------
}
}
}
return;
}
unsigned int LocalTime2UTC(P_LOCAL_TIME ptTime)
{
/* d0
| |<------>| | |
---+--------------+--------------+---------------+--------
| | | |
0 x 400 y 800 1200
|<--------------->|
dx = (y-x)%400
*/
unsigned int x = 1970;
unsigned int y = ptTime->Year;
unsigned int days = 0;
unsigned int dx = 0,d0 = 0;
days += (y-x)/400*(400*365+97);
dx = (y-x) % 400;
d0 = 400 - x%400;
if (dx>d0)
{
days++;
}
//-------------------------------------------------------------
x += (y-x)/400*400;//新的x位置,此时的100年内变为了4年一闰,百年不闰
/* d0
| |<------>| | |
---+--------------+--------------+---------------+--------------
| | | |
0 x 100 y 200 300
|<--------------->|
dx = (y-x)%100
*/
days += (y-x)/100*(100*365+24);
dx = (y-x)%100;
d0 = 100 - (x%100);
//如果剩下的小于100年跨度了100整数倍.则闰年少一年.即天数-1;这样在100年内换算成4年必定一闰
if (dx > d0)
{
days--;
}
//-------------------------------------------------------------
x += (y-x)/100*100;//新的x位置,4年一闰
/* d0
| |<------>| | |
---+--------------+--------------+---------------+--------------
| | | |
0 x 4 y 8 12
|<--------------->|
dx = (y-x)%4
*/
days += (y-x)/4*(4*365+1);
dx = (y-x)%4;
d0 = 4- x%4;
if (dx>d0)
{
days++;
}
//-------------------------------------------------------------
x += (y-x)/4*4;//新的x位置,此时已经没有了闰年
/* d0
| |<------>| | |
---+--------------+--------------+---------------+--------------
| | | |
0 x 4 y 8 12
|<--------------->|
dx = (y-x)%4
*/
days += (y-x)*365;
if (ptTime->Month == 1)
{
days += (ptTime->Date-1);
}else{
if(IsRunNian(y))
{
days += days2MonthRun[(ptTime->Month-1)-1];
}else{
days += days2MonthNormal[(ptTime->Month-1)-1];//如果给定的月份数为x则,只有x-1个整数月
}
days += ptTime->Date-1;
}
return (days*24*3600 + ptTime->Hour*3600 +ptTime->Minute*60 + ptTime->Second);
}
- 1
- 2
前往页