C/C++ struct tm结构体详解之shell date命令

前言
本文将探讨在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 <stdio.h>
#include <time.h> // 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 <stdio.h>
#include <time.h>//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 从19701100: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      //显示下一年的日期

在这里插入图片描述

扫二维码关注微信公众号,获取技术干货

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值