linux C/C++实现同步NTP时间

一、时间类型及常用函数

(1)时间类型

本地时间(locale time)
格林威治时间(Greenwich Mean Time GMT)
世界标准时间 (Universal Time Coordinated UTC)

GMT、UTC时间,都是以秒数为单位计数:

  • 时间是从1970年01月01日 0:00:00起到现在经过的秒数。

  • NTP时间是从1900/1/1 00:00:00开始算

    #include <time.h>
    #include <stdio.h>

    int main()
    {
    time_t timep; //用来存储从1970年到现在经过了多少秒
    time(&timep); //获取time_t类型的当前时间
    printf("%ld\n", timep);
    printf("%s", ctime(&timep));
    return 0;
    }
    得到:1539332642

通过函数ctime()将其转换为真实世界时间:Fri Oct 12 16:30:01 2018

(2)常用时间函数举例

因为时区不同的关系,不同函数取得的时间会相差8个小时(北京处于东八区)。简单举例:

获得UTC时间:time()、asctime()、gmtime()… …
获得经时区转换后的时间:ctime()、localtime()… …

#include <time.h>
#include <stdio.h>

int main()
{ 
    time_t timep;  
    time(&timep);  
    printf("%ld\n", timep);   
    printf("北京时间:%s", ctime(&timep));  
    printf("UTC时间:%s", asctime(gmtime(&timep)));  
    return 0;  
}  

更多与时间相关的内容可参考这个博客:
c++ 时间类型详解(time_t和tm)
Linux C++中的时间函数(转)

(3)UTC时间转换成秒,再转换成当前时间

#include <time.h>
#include <stdio.h>
/*
struct tm 
{
  int tm_sec;       /* 秒 – 取值区间为[0,59] */ 
  int tm_min;       /* 分 - 取值区间为[0,59] */ 
  int tm_hour;      /* 时 - 取值区间为[0,23] */ 
  int tm_mday;      /* 一个月中的日期 - 取值区间为[1,31] */ 
  int tm_mon;       /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */ 
  int tm_year;      /* 年份,其值等于实际年份减去1900 */ 
  int tm_wday;      /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一 */ 
  int tm_yday;      /* 从每年1月1日开始的天数– 取值区间[0,365],其中0代表1月1日 */ 
  int tm_isdst;     /* 夏令时标识符,夏令时tm_isdst为正;不实行夏令时tm_isdst为0 */    
};
*/
typedef struct RTSPUTCTime
{
    int year;
    int mon;
    int day;
    int hour;
    int min;
    int second;
} RTSPUTCTime;

time_t utc2seconds(RTSPUTCTime *utc)
{
    struct tm tm_time;

    memset(&tm_time, 0, sizeof(tm_time));
    tm_time.tm_year = utc->year - 1900;
    tm_time.tm_mon  = utc->mon;
    tm_time.tm_mday = utc->day;
    tm_time.tm_hour = utc->hour;
    tm_time.tm_min  = utc->min;
    tm_time.tm_sec  = utc->second;
return mktime(&tm_time);
}
int main()
{ 
  struct tm *tm_now;
  RTSPUTCTime utc = {2019,3,15,9,30,15};   // 给定一个UTC时间
  time_t seektime = utc2seconds(&utc);    // 将UTC时间转化为秒
  tm_now = localtime(&seektime);        // 将秒转化为当前时间

  printf("tm_now =%d-%d-%d %d:%d:%d \n",tm_now->tm_year+1900, tm_now->tm_mon, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec);
}

参考

  1. c++ 时间类型详解(time_t和tm)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baibingql

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值