Linux 时间表示

先理解以下几个概念:

    UTC(universal time coordinated)称为协调时间,协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。现在的标准时间——协调世界时(UTC)——由原子钟提供。

   格林尼治标准时间(Greenwich Mean Time,GMT)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。 地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用

    Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。无论哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。日历时间返回自1970-1-1:00:00:00以来所经过的秒数累计值。因此,不论服务器是在那个时区(国家),同一时刻,日历时间总是一样的,都是相对于1970-1-1:00:00:00以来的秒数。

    时区(Time Zone)是地球上的区域使用同一个时间定义。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区)、东1-12区,西1-12区。每个时区横跨经度15度,时间正好是1小时。

Linux常用的时间函数:

     asctime,  ctime, gmtime, localtime, gettimeofday mktime, asctime_r, ctime_r, gmtime_r, localtime_r

Linux常用时间结构体:

struct tm {
               int tm_sec;         /* seconds代表目前秒数,正常范围为0-59,但允许至61秒 */
               int tm_min;        /* minutes 代表目前分数,范围0-59*/
               int tm_hour;       /* hours从午夜算起的时数,范围为0-23 */
               int tm_mday;      /* day of the month目前月份的日数,范围01-31 */
               int tm_mon;        /* month 代表目前月份,从一月算起,范围从0-11*/
               int tm_year;        /* year 从1900 年算起至今的年数*/
               int tm_wday;       /* day of the week 一星期的日数,从星期一算起,范围为0-6*/
               int tm_yday;        /* day in the year  从今年1月1日算起至今的天数,范围为0-365*/
               int tm_isdst;        /* daylight saving time 日光节约时间的旗标     */
           };

struct timeval {
               time_t      tv_sec;            /* seconds (秒)*/
               suseconds_t tv_usec;    /* microseconds(微秒) */
           };
struct timezone {
               int tz_minuteswest;     /* minutes west of Greenwich  格林威治时间往西方的时差 */
               int tz_dsttime;             /* type of DST correction 时间的修正方式 */
           };

Linux时间函数:

    #include <time.h>
    time_t time(time_t *t);
返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数,成功返回秒数,错误则返回(time_t) -1),错误原因存于errno中
    
   struct tm *localtime(const time_t *timep);
   struct tm *localtime_r(const time_t *timep, struct tm *result)
localtime并不是线程安全的,观察localtime和localtime_r的调用发现,localtime在使用时,我们只需定义一个指针,并不需要为指针申请空间,而指针必须要指向内存空间才可以使用,其实申请空间的动作由函数自己完成,这样在多线程的情况下,如果有另一个线程调用了这个函数,那么指针指向的struct tm结构体的数据就会改变. 在localtime_s与localtime_r调用时,定义的是struct tm的结构体,获取到的时间已经保存在struct tm中,并不会受其他线程的影响。

      struct tm *gmtime(const time_t *timep); 
      struct tm *gmtime_r(const time_t *timep, struct tm *result);
gmtime是把日期和时间转换为格林威治(GMT)时间的函数,而gmt_time会把结果存储在result中
       char *asctime(const struct tm *tm);
      char *asctime_r(const struct tm *tm, char *buf);
将时间转换为字符串
      char *ctime(const time_t *timep);
      char *ctime_r(const time_t *timep, char *buf);
 将日历时间转换为字符串
   time_t mktime(struct tm *tm);
将时间结构体struct tm的值转化为经过日历时间
 int gettimeofday(struct timeval *tv, struct timezone *tz);
   int settimeofday(const struct timeval *tv, const struct timezone *tz);
获取和设置系统时间


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值