Linux获取本地时间

1.时间的表示方法

参考链接
Linux内核中表示时间的结构体和数据类型有5种, 具体其声明的头文件在:#include<sys/time.h> #include<sys/types.h>

extern void do_gettimeofday(struct timeval *tv);

//gettimeofday函数执行成功后返回0,失败后返回-1,错误代码存于errno中。
extern int gettimeofday(struct timeval *__restrict __tv, __timezone_ptr_t __tz);

//POSIX.1b结构,最小时间单位为微秒(1e-6s)
struct timeval 
{
  __kernel_time_t         tv_sec;         /* seconds */
  __kernel_suseconds_t    tv_usec;        /* microseconds */
};
extern void getnstimeofday(struct timespec *tv); 

//POSIX.1b结构,最小时间单位为纳秒(1e-9s)
struct timespec
{
  __time_t tv_sec;		/* Seconds.  */
  __syscall_slong_t tv_nsec;	/* Nanoseconds.  */
};
struct timezone 
{                                                                                                                                                                          
  int     tz_minuteswest; /* minutes west of Greenwich */
  int     tz_dsttime;     /* type of dst correction */
};
struct tm
{
  int tm_sec;			/* Seconds.	[0-60] (1 leap second) */
  int tm_min;			/* Minutes.	[0-59] */
  int tm_hour;			/* Hours.	[0-23] */
  int tm_mday;			/* Day.		[1-31] */
  int tm_mon;			/* Month.	[0-11] */
  int tm_year;			/* Year	- 1900.  */
  int tm_wday;			/* Day of week.	[0-6] */
  int tm_yday;			/* Days in year.[0-365]	*/
  int tm_isdst;			/* DST.		[-1/0/1]*/
# ifdef	__USE_BSD
  long int tm_gmtoff;		/* Seconds east of UTC.  */
  const char *tm_zone;		/* Timezone abbreviation.  */
# else
  long int __tm_gmtoff;		/* Seconds east of UTC.  */
  const char *__tm_zone;	/* Timezone abbreviation.  */
# endif
};
//time_t该类型被定义在include/linux/types.h中,它是一个长整型,用来表示1970年以来的秒数。
typedef __kernel_time_t         time_t;

2.字符串与struct tm转换函数

  1. 函数原型
//把从1970.1.1零点零分到当前时间系统所偏移的秒数时间转换为本地时间
struct tm *localtime(const time_t *clock);
//把从1970.1.1零点零分到当前时间系统所偏移的秒数时间转换为格林威治(GMT)时间
//即位于英国伦敦郊区的皇家格林尼治天文台的标准时间
//!注意:不会经过时区变换
struct tm *gmtime(const time_t *time);
//string 转 struct tm
char *strptime(const char *,const char *, struct tm *);
//struct tm 转string
size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timeptr);
  1. strptime与strftime格式化参数说明
    函数strftime()的操作有些类似于 sprintf():识别以 百分号(%)开始的格式命令集合,格式化输出结果放在一个字符串中。格式化命令说明串strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面,它们是区分大小写的。

%a 星期几的简写
%A 星期几的全称
%b 月分的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟: hh:mm
%S 十进制的秒数
%t 水平 制表符
%T 显示时分秒:hh:mm: ss
%u 每周的第几天,星期一为 第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日做为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号

  1. 示例
//获取当前精确时间(1970年1月1日到现在的时间)
struct timeval _tv;
if(-1 == gettimeofday(&_tv, NULL))
{
	std::cout << "error : " << errno << std::endl;
	return ;
}

//微秒精度会被丢弃
struct tm *now = localtime(&_tv.tv_sec);

//struct tm 转字符串 "2020-12-03 00:36:38"
std::string strFormat = "Now : %Y-%m-%d %H:%M:%S";
char chOut[100] = {0};
strftime(chOut,100,strFormat.c_str(), now );

//字符串转struct tm
std::string strTmep= "Now : 2020-12-03 00:36:38";
struct tm test;
strptime(strTmep.c_str(), strFormat.c_str(), &test);
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页