在 Linu shell 中自由操作时间变量

在我之前的一篇文章中提到了在C程序中如何自由的将当前或者指定的时间按照格式自由输出。如果我们要在shell中做差不多的事情呢?这篇文章就是说这个的。

本文地址:https://segmentfault.com/a/1190000006038638

date命令输出

如果是要输出当前时间的格式的话,那么使用类似于以下格式即可

# date "+%Y-%m-%d"

上面这个命令的输出结果是:2016-07-22。简而言之,以这个格式调用date(记得在双引号最前面加上“+”),可以让date按照你所自定义的格式来输出当前的日期。以百分号开头的就是日期格式,剩下的字符就是你自定义的,date会将你自定义的字符原原本本的输出来。比如:

# date "+Today is %b %e, %Y. It is %l:%M:%S on %A."Today is Jul 22, 2016. It is  8:01:57 on Friday.# 

date命令的格式符,请参照手册页man date。

date日期变量操作

%s 格式和 -d 参数

我们可以留意到,date命令里有一个格式符是“%s”(注意小写),以及date的一个命令参数

-d, --date=STRING         display time described by STRING, not `now'%s     seconds since 1970-01-01 00:00:00 UTC

其中%s很好理解,这不就是和time(NULL)一样的嘛 ~~

至于-d,我感觉是很强大的。这里仅仅说明本文需要涉及的知识:

  1. 首先,date -d ...的输出,是带上当地时区偏移的时间(local time),这点要记住

  2. 其次,date -d ...中的参数,可以传入一个1970年1月1日以来的UTC秒数值,方法是加上@符号。要记住,是UTC秒数,不是本地时间

比如:

# date -d @60Thu Jan  1 08:01:00 HKT 1970

相信这个例子已经挺清楚了,我传入time值为60(格林威治时间1970年1月1日0:01:00),然后date返回给我一个在当时的北京时间。

时间值操作

有了1970年以来的秒数,剩下的事情就好说了。这里再给一个例子吧。我们有一个需求:
编译时,获得编译时7天后的日期,并且以那一天的0:00:00这个时间值进行操作

很简单,在Makefile里面这么写就好了:

CURR_TIMESTAMP=$(shell date "+%s")    # 获取当前的时间秒数,注意是UTC时间OFFSET_TIMESTAMP=604800               # 这是7天的秒数,我要在上面的秒数基础上做偏移INSTALL_TIMESTAMP=$(shell echo `expr $(CURR_TIMESTAMP) + $(OFFSET_TIMESTAMP)`)    # 转换成七天后的日子....PHONY:installinstall:    ...    date -d "@$(INSTALL_TIMESTAMP)" "+%Y-%m-%d 0:0:0" | xargs ...        # 找到日期字符串进行操作    date -d "@$(INSTALL_TIMESTAMP)" "+%Y-%m-%d 0:0:0" | xargs -I [] date -d "[]" "+%s" | xargs ...        # 找到转换后的日期秒数进行操作    ...

看起来比较混乱的是“找到转换后的日期秒数进行操作”,这里总共分三次:
1、date -d "@$(INSTALL_TIMESTAMP)" "+%Y-%m-%d 0:0:0":因为我们不需要精确的描述,只需要0:0:0,因此首先把当前的timestamp转换成一个字符串,但是这个字符串的时间被我们定死了。
2、xargs -I [] date -d "[]" "+%s":原来的那个带着“0:0:0”时间的字符串,date是有能力识别的,这里再使用"+%s"让date帮我们转换成数字值
3、xargs ...:拿到了数字值,随便你操作。

姊妹篇

在C程序中按照你想要的格式输出时间:strftime()

关键字:linux, shell, date, 日期转换


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部