10-3 获取日历时间

1. 时间戳转换为日历时间

        时间戳是记录的是绝对的秒数或者毫秒数,人类不可读,而日历时间是人类可读时间。可以利用函数 localtime() 将时间戳转换为日历时间。注意,localtime() 函数返回值是 tm 时间类型的指针,对应的是当前电脑系统所在时区的各项时间属性。

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

void TestLocaltime(){

  // 获取当前时间
  time_t current_time;
  time(&current_time);

  // 将时间戳转换为 tm
  struct tm *calendar;
  calendar = localtime(&current_time);

  // 利用 tm 输出人类可读时间,注意 tm_year的输出是在1900的基础上输出的,tm_mon是从0开始输出的
  printf("%d/%d/%d %d:%d:%d\n",
         calendar->tm_year + 1900, calendar->tm_mon + 1, calendar->tm_mday,
         calendar->tm_hour, calendar->tm_min, calendar->tm_sec);
}

        此外,还有一个函数 gmtime() 也可以用于获取 struct tm 时间类型的时间。只不过与 localtime() 相比,gmtime() 返回的是零时区的时间,并非电脑系统对应的时区时间。

void TestGmtime(){
  // 获取当前时间
  time_t current_time;
  time(&current_time);

  // 将时间戳转换为 tm,
  // 北京时间
  struct tm* calendar;
  calendar = localtime(&current_time);

  // 2021/8/9 21:7:2
  printf("%d/%d/%d %d:%d:%d\n",
         calendar->tm_year + 1900, calendar->tm_mon + 1, calendar->tm_mday,
         calendar->tm_hour, calendar->tm_min, calendar->tm_sec);

  // 零时区时间
  struct tm* calendar2 = gmtime(&current_time);

  // 2021/8/9 13:7:2
  printf("%d/%d/%d %d:%d:%d\n",
         calendar2->tm_year + 1900, calendar2->tm_mon + 1, calendar2->tm_mday,
         calendar2->tm_hour, calendar2->tm_min, calendar2->tm_sec);
}

2. 日历时间转换为时间戳

        利用函数 mktime() 可以将 struct tm 时间类型转化为 time_t 时间戳。不仅如此,mktime() 还可以对 struct tm 类型的变量进行调整。例如 calendar 的秒数被赋值为 70,那么 mktime() 可以让其自动进位,分钟值加1,秒值变为10。

void TestMktime(){

  // 获取当前时间
  time_t current_time;
  time(&current_time);
  printf("current_time: %lld\n", current_time);

  // 将时间戳转换为 tm
  struct tm *calendar;
  calendar = localtime(&current_time);

  calendar->tm_sec = 80;

  // 2021/8/9 20:58:80
  printf("%d/%d/%d %d:%d:%d\n",
         calendar->tm_year + 1900, calendar->tm_mon + 1, calendar->tm_mday,
         calendar->tm_hour, calendar->tm_min, calendar->tm_sec);

  // 将 tm 转为时间戳,并且调整 tm 的时间数据,使其自动进位
  time_t current_time2 = mktime(calendar);
  printf("current_time2: %lld\n", current_time2);

  // 2021/8/9 20:59:20,与上面相比,自动进位
  printf("%d/%d/%d %d:%d:%d\n",
         calendar->tm_year + 1900, calendar->tm_mon + 1, calendar->tm_mday,
         calendar->tm_hour, calendar->tm_min, calendar->tm_sec);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值