c++ time 时间 获取 打印

参考链接:https://www.runoob.com/w3cnote/cpp-time_t.html

1 时间的基础知识

1 原子时

利用铯原子振荡周期极为规律的特性,将铯原子能级跃迁辐射9192631770周所经历的时间定为1s。

2 世界协调时

世界协调时是以地球自转为基础的时间标准。由于地球自转速度并不均匀,并非每天都是精确的86400原子s,因而导致了自转时间与世界时之间存在18个月有1s的误差。为纠正这种误差,国际地球自转研究所根据地球自转的实际情况对格林威治时间进行增减闰s的调整,与国际度量衡局时间所联合向全世界发布标准时间,这就是所谓的世界协调时(UTC:CoordinatdeUniversalTime)

2 存储时间的两个类

2.1 struct timeval

struct timeval
{
    long tv_sec; /*秒*/
    long tv_usec; /*微秒*/
};

2.2 struct tm

struct tm
{
    int tm_sec;  /*秒,正常范围0-59, 但允许至61*/
    int tm_min;  /*分钟,0-59*/
    int tm_hour; /*小时, 0-23*/
    int tm_mday; /*日,即一个月中的第几天,1-31*/
    int tm_mon;  /*月, 从一月算起,0-11*/  1+p->tm_mon;
    int tm_year;  /*年, 从1900至今已经多少年*/  1900+ p->tm_year;
    int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
    int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
    int tm_isdst; /*日光节约时间的旗标*/
};

需要特别注意的是,年份和月份需要加偏移。

年份+1900,月份+1。

3 相关函数

3.1 time 获取当前时间 秒级的 距离1900年多少秒

取得从1970年1月1日至今的秒数。

time_t time(time_t *t);

用法:

可以直接传一个nullptr获取返回的对象,也可以穿一个time_t的指针,这样函数会把时间放到指针中,但还是会返回对象(虽然你可以不要)。

样例:

#include <iostream>
#include <string>
#include <time.h>

using namespace std;

int main (int argc, char *argv[]) {
  time_t* tPtr = new time_t();
  printf("%d\n", *tPtr);
  time_t t = time(nullptr);
  printf("%d\n", t);
  t = time(tPtr);
  printf("%d\n", t);
  printf("%d\n", *tPtr);

  return 0;
}

结果:

0
1693190216
1693190216
1693190216

3.2 localtime 获取当前年月日时分秒

将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个struct tm结构指针.

struct tm* localtime(const time_t *timePtr);

用法:

需要传入一个time_t的指针,不能传nullptr。

测试样例:

#include <iostream>
#include <string>
#include <time.h>
#include <string.h>

using namespace std;

string getYMDhmsFromTimeT(const time_t& t)
{
    struct tm* _tm = localtime(&t);
    const int bufferSize = 21;
    char buffer[bufferSize];
    memset(buffer, 0, sizeof(buffer));
    //sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d\n", _tm->tm_year + 1900, _tm->tm_mon + 1, _tm->tm_mday, _tm->tm_hour, _tm->tm_min, _tm->tm_sec);
    strftime(buffer, bufferSize, "%Y-%m-%d %H:%M:%S\n", _tm);
    return buffer;
}

int main (int argc, char *argv[]) {
  time_t t=time(nullptr);
  struct tm* _tm = localtime(&t);
  printf("%s\n", asctime(_tm));
  printf("%04d-%02d-%02d %02d:%02d:%02d\n", _tm->tm_year+1900, _tm->tm_mon+1, _tm->tm_mday, _tm->tm_hour, _tm->tm_min, _tm->tm_sec);
  return 0;
}

3.3 strftime 将 struct tm 格式化输出为字符串

string getYMDhmsFromTimeT(const time_t& t)
{
    struct tm* _tm = localtime(&t);
    const int bufferSize = 21;
    char buffer[bufferSize];
    memset(buffer, 0, sizeof(buffer));
    //sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d\n", _tm->tm_year + 1900, _tm->tm_mon + 1, _tm->tm_mday, _tm->tm_hour, _tm->tm_min, _tm->tm_sec);
    strftime(buffer, bufferSize, "%Y-%m-%d %H:%M:%S\n", _tm);
    return buffer;
}

3.4 ctime 将 time_t 以固定死格式输出为字符串

char *ctime(const time_t *timep);

输出结果:

Mon Aug 28 18:23:56 2023

3.5 asctime 将 struct tm* 以固定死格式输出为字符串

将tm 输出为字符串

char *asctime(const struct tm* timeptr);

输出结果:

Mon Aug 28 18:23:56 2023

3.6 gettimeofday 获取当前毫秒级的时间

返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用

int gettimeofday(struct timeval *tv, struct timezone *tz);

样例:

#include <iostream>
#include <string>
#include <time.h>
#include <sys/time.h>

using namespace std;

int main (int argc, char *argv[]) {
  //int gettimeofday(struct timeval *tv, struct timezone *tz);
  // 0 for success, -1 for failed
  struct timeval* tv=new struct timeval();
  if(!gettimeofday(tv, nullptr))
  {
    printf("%lld, %lld\n", tv->tv_sec, tv->tv_usec);
  }
  time_t t = time(nullptr);
  printf("%lld\n", t);
  return 0;
}

输出结果:

1693218764, 781133
1693218764

3.7 difftime 获取 两个 time_t 的秒数差值

返回两个时间相差的秒数

我的理解是time_t就是 long long,不太明白这个函数存在的意义。

double difftime(time_t time1, time_t time2);

3.8 gmtime 将time_t 转化为 struct tm

将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个struct tm结构指针

与localtime的区别是,localtime自带了时区转换。

struct tm* gmtime(const time_t *timep);

测试样例:

#include <iostream>
#include <string>
#include <time.h>
#include <string.h>

using namespace std;

int main (int argc, char *argv[]) {
  time_t t=time(nullptr);
  struct tm* _tm = localtime(&t);
  printf("%s\n", asctime(_tm));
  printf("%04d-%02d-%02d %02d:%02d:%02d\n", _tm->tm_year+1900, _tm->tm_mon, _tm->tm_mday, _tm->tm_hour, _tm->tm_min, _tm->tm_sec);
  _tm = gmtime(&t);
  printf("%s\n", asctime(_tm));
  printf("%04d-%02d-%02d %02d:%02d:%02d\n", _tm->tm_year+1900, _tm->tm_mon, _tm->tm_mday, _tm->tm_hour, _tm->tm_min, _tm->tm_sec);
  return 0;
}

测试结果:

Mon Aug 28 18:57:58 2023

2023-07-28 18:57:58
Mon Aug 28 10:57:58 2023

2023-07-28 10:57:58

3.9 mktime 将 struct tm 转化为 time_t

将struct tm 结构的时间转换为从1970年至今的秒数

time_t mktime(struct tm* timeptr);
文章目录