免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2096 | 回复: 8
打印 上一主题 下一主题

[日期时间] shell 脚本下 date 的一个小问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-21 17:38 |只看该作者 |倒序浏览
先找某个日期一周前的日期
  1. END_DATE=20130303
  2. END_DATE=$(($END_DATE-7))
  3. END_DATE=$(date -d $END_DATE +%Y%m%d)
  4. echo $END_DATE
复制代码
结果是
  1. 20130507
复制代码
但是如果一天一天的减,就不会出现这个问题
  1. for i in {1..7}
  2. do
  3. END_DATE=$(($END_DATE-1))
  4. END_DATE=$(date -d $END_DATE +%Y%m%d)
  5. done
复制代码
各位高手是用什么方法避免这个问题的呢?求教

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2013-03-21 17:48 |只看该作者
END_DATE=20130303
END_DATE=$(($END_DATE-7))
END_DATE=$(date -d $END_DATE +%Y%m%d)
echo $END_DATE

你居然能得到结果,佩服佩服~
  1. [root@localhost ~]# END_DATE=20130303
  2. [root@localhost ~]# END_DATE=$(($END_DATE-7))
  3. [root@localhost ~]# END_DATE=$(date -d $END_DATE +%Y%m%d)
  4. date: invalid date `20130296'
  5. [root@localhost ~]# echo $END_DATE

  6. [root@localhost ~]#
复制代码

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
3 [报告]
发表于 2013-03-21 17:52 |只看该作者
  1. date -d "7 days ago" +%Y%m%d
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2013-03-21 17:53 |只看该作者
回复 1# udevu

$ date -d 20130303 +%Y%m%d
20130303

$ date -d "20130303 7 days ago"  +%Y%m%d
20130224



   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
5 [报告]
发表于 2013-03-21 17:59 |只看该作者
$ date -d "20130303 7 days ago"  +%Y%m%d
20130224

学习了

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
6 [报告]
发表于 2013-03-21 18:24 |只看该作者
本帖最后由 dn833 于 2013-03-21 18:25 编辑


日常工作中经常使用date这个命令,几乎所有与日期时间相关的操作都会跟这个命令扯上点关系。简单写几条经常使用到的date命令,仅供大家参考。

首先检查一下date的版本,注意如果你用的不是GNU date,那么以下的命令不保证成功。


date --version
date (GNU coreutils) 5.97
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie.
先看看最简单的一个,没啥好解释的。


date
Tue Nov  6 13:43:00 CST 2012
稍微加点花样,搞点格式化输出,%F是按照YYYY-YY-DD的格式显示当前日期,%D是按照MM/DD/YY的格式显示当前日期。还有不少类似%F/D的参数都是啥意思,man date都能找到,就不逐个解释了


date +%F
2012-11-06

date +%D
11/06/12
有很多需求都是计算N天前/后,N月前/后,甚至是N年。。。。。。那么下边的操作应该比较合适


计算3天前的日期
date +%D -d '-3 days'
11/03/12


计算3天后的日期
date +%D -d '+3 days'
11/09/12


计算3天后的日期,写不写+都一个效果,跟上边结果一样
date +%D -d '3 days'
11/09/12


计算1个月前的日期
date +%F -d '-1 month'
2012-10-06


计算1年前的日期
date +%F -d '-1 year'
2011-11-06
再来看看相关时间的操作,有了刚才上边对日期操作的理解,看这个时间相比不难。E文单词不懂的去问translate.google.com.hk ^_^


获取当前时间
date +%T
13:48:25


获取1小时前的时间
date +%T -d '-1 hours'
12:48:27


获取10分钟前的时间
date +%T -d '-10 minutes'
13:38:35


获取3小时后的时间
date +%T -d '3 hours'
16:49:08
有关时间戳的处理,时间戳的基准是1970年1月1日0点0分0秒,注意这可是格林尼治天文台的时间,不是北京时间啊。


显示系统当前的时间戳
date +%s
1352183334


把某时间戳转换回日期格式
date -d "@1352183334"
Tue Nov  6 14:28:54 CST 2012


看到了吧,因为现在这个系统是东8区的时区,所以0时间戳时候,这系统应该已经是1970年1月1日早上8点了
date -d "@0"
Thu Jan  1 08:00:00 CST 1970
再来个计算任意日期的前N日或后N日如何操作


DAY="20000101"
echo $DAY
20000101
date +%F -d "$DAY 1 day"
2000-01-02
date +%F -d "$DAY -1 day"
1999-12-31
计算两个日期相差天数,比如2012年11月1日和2010年5月1日,相差多少天呢?


d1=$(date +%s -d 20121101)
d2=$(date +%s -d 20100501)
echo $(((d1-d2)/86400))
915
就想到这些,有啥不足的大家一起补充。
  
  
  
  

论坛徽章:
0
7 [报告]
发表于 2013-03-21 20:04 |只看该作者
回复 4# jason680
正解,学习了。

   

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
8 [报告]
发表于 2013-03-21 21:39 |只看该作者
@dn833
学习


论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
9 [报告]
发表于 2013-03-21 21:43 |只看该作者
回复 6# dn833


    整理得不错,学习了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP