找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2711|回复: 1
打印 上一主题 下一主题
收起左侧

世界时间自校正显示

[复制链接]
跳转到指定楼层
楼主
ID:193803 发表于 2017-4-26 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <time.h>
#include <stdio.h>
#include <windows.h>
#include <conio.h>


/** 日期时间结构体
*  依次为:秒、分、时、日、月、年、周
*/
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;


/** 存储时差的数组,以世界参考时间地冰岛为参照时间
*  莫斯科 晚13小时 东京 晚7小时 洛杉矶  24小时  伦敦晚16小时
*/
int EquationOfTime[] = {8, 24, 16, 7, 13} ;


/** 全局字符数组
*  存储地名
*/
char AddrName[][15] =
{
    "中国·北京",
    "美国·洛杉矶",
    "英国·伦敦",
    "日本·东京",
    "俄罗斯·莫斯科"
} ;


/** \brief 画图形框上下边的*
* \param
* \return
*/
void ImagePaint(void)
{
    int j ;

    for(j = 0; j < 61; j++)//画一行星号
    {
        printf("* ") ;
    }
    printf("\n") ;//画完一行星号后换行
}


/** \brief  计算地区的日期与时间
* \param TIME_STRUCT *timeinfo:参照时间
* \param int j :与参照时间之间的时差
* \return TIME_STRUCT*指针
*/
TIME_STRUCT* CountDateTime(TIME_STRUCT *timeinfo, int j)
{
    TIME_STRUCT *time_tmpcur ;

    time_tmpcur = timeinfo ;//将临时结构体指针指向传进来的指针
    if(j > 0)//当时差大于0时证明当前地区时间晚于参照时间
    {
        if((j + timeinfo->tm_hour)/24 == 1)//时差晚一天时,因为晚了24小时当前地区的日期应加1
        {
            time_tmpcur->tm_day = timeinfo->tm_day + 1 ; //日期加一天
            time_tmpcur->tm_week = timeinfo->tm_week + 1 ; //周期相应加一天
        }
        else//时差晚少于一天
        {
            time_tmpcur->tm_day = timeinfo->tm_day ;//日期不变
        }
        time_tmpcur->tm_hour = (j + timeinfo->tm_hour)%24 ;//当前时间 =( 时差 + 参照时间)对24的取余
    }
    else if(j < 0)//当时差小于0时证明当前地区时间早于参照时间
    {
        if((j + timeinfo->tm_hour)/24 < 0)//早一天的情况,因为早了24小时以上,当前地区的日期应减一天
        {
            time_tmpcur->tm_day = timeinfo->tm_day - 1 ;//减一天
            time_tmpcur->tm_week = timeinfo->tm_week - 1 ; //周期相应减一天
        }
        else//小于一天的情况
        {
            time_tmpcur->tm_day = timeinfo->tm_day ;
        }
        time_tmpcur->tm_hour = (j + timeinfo->tm_hour)%24 ;
    }
    else if(j == 0)//没有时差
    {
        time_tmpcur->tm_day = timeinfo->tm_day ;
        time_tmpcur->tm_hour = (j + timeinfo->tm_hour)%24 ;
    }
    return time_tmpcur ;//返回指针
}

/** \brief 主函数
*
* \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] ;//二维数组 保存日期字符串方便显示
    char time_str[5][15] ;//二维数组 保存时间字符串方便显示
    int week[5] ;//保存周期 方便显示

    c_time = time(&tmp_t) ;//获得系统的本地时间值

    /**
    *   死循环 用于不断刷新当前时间
    */
    while(1)
    {
        tmp_time = time(&tmp_t) ;//再次获得系统的本地时间值

        if(tmp_time - c_time  >= 1)//当两次系统时间间隔大于一秒的时候
        {
            c_time = tmp_time ;//更新时间值 便于下一次比较
            system("cls") ;     //清屏函数 刷新当前屏幕
            printf("\t\t\t\t\t世界时间\n\n") ;
            ImagePaint() ;//画一行星号做上边框


            /**
             *  循环5次 调用CountDateTime()函数根据当前参照时间与时差依次获得
             *  五个地区的当前时间
             */
            for(i = 0; i < 5; i++)
            {
                time_tmp = gmtime(&tmp_t) ;//获得冰岛时间 世界标准时间地
                time_cur = CountDateTime(time_tmp, EquationOfTime[i]) ;//调用函数并获得返回值结构体指针 返回当前地区时间
                sprintf(date_str[i], "%d-%.2d-%.2d", time_cur->tm_year+1900, time_cur->tm_mon + 1, time_cur->tm_day) ; //调用sprintf()函数将当前地区的日期和时间转化为一个字符串 便于显示
                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 ; //当前地区的当前周期
            }

            /**
             *  显示地名
             *  显示日期
             *  显示周期
             */
            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() ;//画一行星号做下边框
        }
    }

    return 0 ;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:211258 发表于 2017-6-15 16:13 | 只看该作者
非常好
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表