|
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <conio.h>
/** 日期時(shí)間結(jié)構(gòu)體
* 依次為:秒、分、時(shí)、日、月、年、周
*/
typedef struct
{
int tm_sec ;
int tm_min ;
int tm_hour ;
int tm_day ;
int tm_mon ;
int tm_year ;
int tm_week ;
}TIME_STRUCT;
/** 存儲(chǔ)時(shí)差的數(shù)組,以世界參考時(shí)間地冰島為參照時(shí)間
* 莫斯科 晚13小時(shí) 東京 晚7小時(shí) 洛杉磯 24小時(shí) 倫敦晚16小時(shí)
*/
int EquationOfTime[] = {8, 24, 16, 7, 13} ;
/** 全局字符數(shù)組
* 存儲(chǔ)地名
*/
char AddrName[][15] =
{
"中國·北京",
"美國·洛杉磯",
"英國·倫敦",
"日本·東京",
"俄羅斯·莫斯科"
} ;
/** \brief 畫圖形框上下邊的*
* \param
* \return
*/
void ImagePaint(void)
{
int j ;
for(j = 0; j < 61; j++)//畫一行星號(hào)
{
printf("* ") ;
}
printf("\n") ;//畫完一行星號(hào)后換行
}
/** \brief 計(jì)算地區(qū)的日期與時(shí)間
* \param TIME_STRUCT *timeinfo:參照時(shí)間
* \param int j :與參照時(shí)間之間的時(shí)差
* \return TIME_STRUCT*指針
*/
TIME_STRUCT* CountDateTime(TIME_STRUCT *timeinfo, int j)
{
TIME_STRUCT *time_tmpcur ;
time_tmpcur = timeinfo ;//將臨時(shí)結(jié)構(gòu)體指針指向傳進(jìn)來的指針
if(j > 0)//當(dāng)時(shí)差大于0時(shí)證明當(dāng)前地區(qū)時(shí)間晚于參照時(shí)間
{
if((j + timeinfo->tm_hour)/24 == 1)//時(shí)差晚一天時(shí),因?yàn)橥砹?4小時(shí)當(dāng)前地區(qū)的日期應(yīng)加1
{
time_tmpcur->tm_day = timeinfo->tm_day + 1 ; //日期加一天
time_tmpcur->tm_week = timeinfo->tm_week + 1 ; //周期相應(yīng)加一天
}
else//時(shí)差晚少于一天
{
time_tmpcur->tm_day = timeinfo->tm_day ;//日期不變
}
time_tmpcur->tm_hour = (j + timeinfo->tm_hour)%24 ;//當(dāng)前時(shí)間 =( 時(shí)差 + 參照時(shí)間)對(duì)24的取余
}
else if(j < 0)//當(dāng)時(shí)差小于0時(shí)證明當(dāng)前地區(qū)時(shí)間早于參照時(shí)間
{
if((j + timeinfo->tm_hour)/24 < 0)//早一天的情況,因?yàn)樵缌?4小時(shí)以上,當(dāng)前地區(qū)的日期應(yīng)減一天
{
time_tmpcur->tm_day = timeinfo->tm_day - 1 ;//減一天
time_tmpcur->tm_week = timeinfo->tm_week - 1 ; //周期相應(yīng)減一天
}
else//小于一天的情況
{
time_tmpcur->tm_day = timeinfo->tm_day ;
}
time_tmpcur->tm_hour = (j + timeinfo->tm_hour)%24 ;
}
else if(j == 0)//沒有時(shí)差
{
time_tmpcur->tm_day = timeinfo->tm_day ;
time_tmpcur->tm_hour = (j + timeinfo->tm_hour)%24 ;
}
return time_tmpcur ;//返回指針
}
/** \brief 主函數(shù)
*
* \param
* \param
* \return
*
*/
int main(void)
{
time_t tmp_t ;
TIME_STRUCT *time_cur, *time_tmp ;
int long tmp_time, c_time ;
int i ;
char date_str[5][15] ;//二維數(shù)組 保存日期字符串方便顯示
char time_str[5][15] ;//二維數(shù)組 保存時(shí)間字符串方便顯示
int week[5] ;//保存周期 方便顯示
c_time = time(&tmp_t) ;//獲得系統(tǒng)的本地時(shí)間值
/**
* 死循環(huán) 用于不斷刷新當(dāng)前時(shí)間
*/
while(1)
{
tmp_time = time(&tmp_t) ;//再次獲得系統(tǒng)的本地時(shí)間值
if(tmp_time - c_time >= 1)//當(dāng)兩次系統(tǒng)時(shí)間間隔大于一秒的時(shí)候
{
c_time = tmp_time ;//更新時(shí)間值 便于下一次比較
system("cls") ; //清屏函數(shù) 刷新當(dāng)前屏幕
printf("\t\t\t\t\t世界時(shí)間\n\n") ;
ImagePaint() ;//畫一行星號(hào)做上邊框
/**
* 循環(huán)5次 調(diào)用CountDateTime()函數(shù)根據(jù)當(dāng)前參照時(shí)間與時(shí)差依次獲得
* 五個(gè)地區(qū)的當(dāng)前時(shí)間
*/
for(i = 0; i < 5; i++)
{
time_tmp = gmtime(&tmp_t) ;//獲得冰島時(shí)間 世界標(biāo)準(zhǔn)時(shí)間地
time_cur = CountDateTime(time_tmp, EquationOfTime[i]) ;//調(diào)用函數(shù)并獲得返回值結(jié)構(gòu)體指針 返回當(dāng)前地區(qū)時(shí)間
sprintf(date_str[i], "%d-%.2d-%.2d", time_cur->tm_year+1900, time_cur->tm_mon + 1, time_cur->tm_day) ; //調(diào)用sprintf()函數(shù)將當(dāng)前地區(qū)的日期和時(shí)間轉(zhuǎn)化為一個(gè)字符串 便于顯示
sprintf(time_str[i], "%d:%.2d:%.2d", time_cur->tm_hour, time_cur->tm_min, time_cur->tm_sec) ;
week[i] = time_cur->tm_week ; //當(dāng)前地區(qū)的當(dāng)前周期
}
/**
* 顯示地名
* 顯示日期
* 顯示周期
*/
printf("*\t%s\t*\t%s\t*\t%s\t*\t%s\t*\t%s\t*\n", AddrName[0], AddrName[1], AddrName[2], AddrName[3], AddrName[4]) ;
printf("*\t%s\t*\t%s\t*\t%s\t*\t%s\t*\t%s\t*\n", date_str[0], date_str[1], date_str[2], date_str[3], date_str[4]) ;
printf("*\t%s\t*\t%s\t\t*\t%s\t*\t%s\t\t*\t%s\t*\n", time_str[0], time_str[1], time_str[2], time_str[3], time_str[4]) ;
printf("*\t星期%d\t\t*\t星期%d\t\t*\t星期%d\t\t*\t星期%d\t\t*\t星期%d\t\t*\n", week[0], week[1], week[2], week[3], week[4]) ;
ImagePaint() ;//畫一行星號(hào)做下邊框
}
}
return 0 ;
}
|
|