前言
本文将探讨在time.h头文件中定义的类型(struct tm),我们可通过tm结构来获得日期和时间。linux 中提供一个date命令用于显示或设置系统时间与日期。但在这之前你需要了解一些“时间”和“日期”的概念。
什么是UTC
UTC是世界标准时间。UTC是目前主要的世界时间标准,广泛应用在航空、天气预报、同步计算机时钟等各领域。需要注意的是中国内地的时间与UTC的时为+8,也就是UTC+8。
struct tm 结构中的成员
struct tm
{
int tm_sec; //分后的秒(0~61)
int tm_min; //小时后的分(0~59)
int tm_hour; //小时(0~23)
int tm_mday; //一个月天数(0~31)
int tm_mon; //一个后的月数(0~11)
int tm_year; //1900年后的年数 Year - 1900.
int tm_wday; //星期日开始的天数(0~6)
int tm_yday; //从1月1日开始的时间(0~365)
int tm_isdst; //夏令时标志(大于0说明夏令时有效,等于0说明无效,小于0说明信息不可用)
};
日历时间表示当前的时间,例如,可以是从1900年的第1秒开始经过的秒数。本地时间指的是本地时区的日历时间,下面带有结构struct tm中的时间函数如下:
time_t mktime(struct tm* tmptr);//把tmptr指向的结构中的分解时间转换成日历时间
char *asctime(const struct tm *tmpt)//把tmpt指向的结构中的分解时间转换成 Thu Feb 26 13:14:13 1998\n\0格式的字符串
struct tm *gmtime(const time_t *ptm);//把ptm指向的日历时间转换成协调世界时(UTC)表示的分解时间,返回一个指向结构的指针,该结构中储时间信息
struct tm *locatime(const time_t *ptm);//把ptm指向的日历时间转换成本地时间表示的分解时间
下面的实例演示了 gmtime() 函数的用法。
#include
#include // time_t 、struct tm
#define BST (+1)
#define CCT (+8)
int main(int argc, char const *argv[])
{
time_t rawtime;
struct tm *info;
time(&rawtime);
// 获取 GMT 时间
info = gmtime(&rawtime );
printf("当前的世界时钟:\n");
printf("伦敦:%2d:%02d\n", (info->tm_hour+BST)%24, info->tm_min);
printf("中国:%2d:%02d\n", (info->tm_hour+CCT)%24, info->tm_min);
return(0);
}
下面再举个例子,输入年、月、日得到日期判断是周几
#include
#include //time_t 、struct tm、time、mktime
struct tm *get_weeks(time_t rawtime, struct tm *timeinfo);
int main(int argc, char const *argv[])
{
time_t rawtime;
struct tm * timeinfo;
const char * weekday[] = { "Weekday", "Monday","Tuesday ", "Wednesday","Thursday", "Friday", "Saturday"};
struct tm * info = get_weeks( rawtime, timeinfo);
printf ("Is that day:%s\n", weekday[info->tm_wday]); //打印显示是星期几
return 0;
}
struct tm *get_weeks(time_t rawtime, struct tm *timeinfo)
{
int year,month,day;
printf ("year: "); fflush(stdout); scanf ("%d",&year);
printf ("month: "); fflush(stdout); scanf ("%d",&month);
printf ("day: "); fflush(stdout); scanf ("%d",&day);
//获得当前时间的信息
time(&rawtime);
timeinfo = localtime(&rawtime);
timeinfo->tm_year = year - 1900;
timeinfo->tm_mon = month - 1;
timeinfo->tm_mday = day;
mktime(timeinfo);
return timeinfo;
}
shell date命令
date命令是显示或设置系统时间与日期。很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。延时通常用于脚本执行过程中提供一段等待的时间。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。
语法:
date(选项)(参数)
参数
%H 小时,24小时制(00~23)
%I 小时,12小时制(01~12)
%k 小时,24小时制(0~23)
%l 小时,12小时制(1~12)
%M 分钟(00~59)
%p 显示出AM或PM
%r 显示时间,12小时制(hh:mm:ss %p)
%s 从1970年1月1日00:00:00到目前经历的秒数
%S 显示秒(00~59)
%T 显示时间,24小时制(hh:mm:ss)
%X 显示时间的格式(%H:%M:%S)
%Z 显示时区,日期域(CST)
%a 星期的简称(Sun~Sat)
%A 星期的全称(Sunday~Saturday)
%h,%b 月的简称(Jan~Dec)
%B 月的全称(January~December)
%c 日期和时间(Tue Nov 20 14:12:58 2012)
%d 一个月的第几天(01~31)
%x,%D 日期(mm/dd/yy)
%j 一年的第几天(001~366)
%m 月份(01~12)
%w 一个星期的第几天(0代表星期天)
%W 一年的第几个星期(00~53,星期一为第一天)
%y 年的最后两个数字(1999则是99)
shell date 命令实例演示:
date
后面CST是表示本地时区的日历时间。
date -u
可以看到后面输出有UTC, 表示这显示是按世界标准时间输出。对比上面date命令输出时间信息。中国内地的时间与UTC的时为+8,也就是UTC+8。
date 格式化输出
格式化输出:
date +"%Y-%m-%d"
date +"%Y/%m/%d %H:%M:%S"
还能这样输出时间信息:加减操作
date +%Y%m%d //显示前天年月日
date -d "+1 day" +%Y%m%d //显示前一天的日期
date -d "-1 day" +%Y%m%d //显示后一天的日期
date -d "-1 month" +%Y%m%d //显示上一月的日期
date -d "+1 month" +%Y%m%d //显示下一月的日期
date -d "-1 year" +%Y%m%d //显示前一年的日期
date -d "+1 year" +%Y%m%d //显示下一年的日期
扫二维码关注微信公众号,获取技术干货