2017.10.10 shell中的日期问题


shell中的日期问题,要彻底弄清楚。写一个测试脚本test.sh

首先是单引号 双引号的问题。

单引号将变量和特殊字符括起来将失去原有的意义,而只作为普通字符解释。双引号括起来后特殊字符将保持原有的意义,其余的作为普通字符解释。

#!/bin/sh
. ~/.bash_profile
source /etc/profile

current_day=date +%Y%m%d 无符号
echo "current_day:$current_day"

测试结果为 current_day:

current_day=`date +%Y%m%d`单引号(tab上的单引号)

测试结果为 current_day:date +%Y%m%d

current_day=“date +%Y%m%d" 双引号

测试结果为 current_day:date +%Y%m%d

current_day=“`date +%Y%m%d`" 外双内单  (这里把双引号去掉也可以!!!!!)

测试结果为 current_day:20171010


两天后=`date -d "2 day"`

测试结果为 两天后:2017年 10月 12日 星期四 10:43:22 CST (如果不加+%Y%m%d,则会显示两天后此时此刻的全部日期信息,包括时分秒)

(这里说明day是特殊字符,用双引号括起来也保持其特殊意义。)

两天后=`date +%Y%m%d -d "2 day"`

测试结果为 两天后:20171012


两天前=`date +%Y%m%d -d "2 day ago"`

测试结果为 两天前:20171008     (这里说明ago是特殊字符有特殊意义,用双引号括起来也保持其特殊意义。)


last_month=`date -d "1 month ago"` 获取一个月以前的当前时间
测试结果为 last_month:2017年 09月 10日 星期日 11:00:34 CST

始终都要保持外面有个单引号 这样啊   混蛋!


普及完基础知识,来电高端点的


求昨天的日期

如果现在的时间是20180101,那 1 day ago这种写法还行得通吗?

有一个思路就是

正确的做法应该是在脚本一开始就取得当前的时间戳, 然后, 在整个脚本中, 始终使用这个时间戳来做为当前时间, 这才能保证, 在整个脚本的运行期间, 你得到的结果,都是你想要的, 而不管你是在午夜,还是大早上的运行你的脚本.  关于时间的计算, 最好是以"秒"为最小单位, 这样, 不仅可以保证你得到精确的时间, 还能保证你躲过什么1号, 或者年底, 或者闰年, 之类的麻烦.我今天实测的

current_time="`date +%s`"
echo "current_time:$current_time"

current_day=`date +%Y%m%d -d @$current_time`
echo "current_day:$current_day"

yesterday=`date +%Y%m%d -d @$((current_time-86400))`
echo "yesterday:$yesterday"

求上个月

#坑01 
#2016年当month为01的时候,上年月份为2015-12
#2016年当month为12的时候,下年月份为2017-01
#2016年当month为其余月份时候,月份加1或者减一
year=`date -d "0 month ago" +%Y`

month=`date -d "0 month ago" +%m`

nowdate=`date -d "0 month ago" +%Y-%m`

one='01'
if [ $month == $one ]
then
echo "当month为01的时候,上年月份为2015-12"
LastYear=$[$year-1]
Lastdate=$LastYear-12
Nextdate=$year-0$[$month+1] 
echo $Lastdate
echo $nowdate
echo $Nextdate
fi

twelve='12'
if [ $month == $twelve ]
then
echo "当month为12的时候,下年月份为2017-01"
NextYear=$[$year+1]
Lastdate=$year-$[$month-1]
Nextdate=$NextYear-01
echo $Lastdate
echo $nowdate
echo $Nextdate
fi

还有一种情况是

在大部分情况下这个命令运行正确。但是有些情况下这个命令会出现问题,比如当前日期是3月30、3月31、5月31等的时候,上面的命令得到的结果还是当月,而不是我们期望的上月。

这个问题是怎么产生的呢?比如当当前日期是5月31时,-1 month它只是将月份-1,就得到4月31,但是实际上4月只有30天,所以4月31就被转为5月1号,导致得到的结果还是当前月份。

为了解决这个问题,可以这么写(先转到当月1号的日期再减):
date +%Y%m -d "`date +%Y%m`01 -1 month"






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值