shell中日期相关操作

1. 获取某种格式的日期和时间

在shell中,需要获取当前系统时间时,一般使用以下命令获取指定格式的时间(年-月-日 时:分:秒):

date '+%Y-%m-%d %H:%M:%S'
2021-10-28 18:13:01
#%F等同于%Y-%m-%d
date '+%F %H:%M:%S'
2021-10-28 18:13:22

文件具有atime(last access time,最近访问文件内容时间),mtime(last modification time,最近文件内容更改时间)和ctime(last change time,最近文件属性更改时间,包含更改文件名,内容,权限,属主和属组等操作的时间)。通过stat命令的各个参数选项可以获取文件的相应时间。

#获取文件的atime
stat -c %x file10
2021-10-28 18:52:08.918516010 +0800
#获取文件的atime(从1970年1月1日开始计算的秒数)
stat -c %X file10
1635418328
#将秒数转换成日期和时间
date -d @1635418328 '+%F %H:%M:%S'
2021-10-28 18:52:08

#获取文件的mtime
stat -c %y file10
2021-10-28 18:52:06.166516206 +0800
#获取文件的mtime(从1970年1月1日开始计算的秒数)
stat -c %Y file10
1635418326
#将秒数转换成日期和时间
date -d @1635418326  '+%F %H:%M:%S'
2021-10-28 18:52:06

#获取文件的ctime
stat -c %z file10
2021-10-28 18:52:44.876513451 +0800
#获取文件的ctime(从1970年1月1日开始计算的秒数)
stat -c %Z file10
1635418364
#将秒数转换成日期和时间
date -d @1635418364 '+%F %H:%M:%S'
2021-10-28 18:52:44

2. 日期比较

如果要比较两个日期的远近,可以先将日期转换成从1970-01-01开始计算的秒数,然后进行秒数的比较,再判断日期的远近。

#比较date1与date2的远近
date1='2021-10-27 16:51:39'
date2='2021-10-28 10:08:25'

date1s=`date -d "$date1" +%s`
date2s=`date -d "$date2" +%s`

if [ $date1s -gt $date2s ]
then
   echo "$date1 is newer than $date2."
elif [ $date1s -eq $ date2s ]
then
   echo "$date1 is equal to $date2."
else
   echo "$date1 is older than $date2."
fi

3. 获取n天前的日期

如果要获取当前日期n天前的日期,可以先将当前时间转换成从1970-01-01开始计算的秒数,然后减去n*86400(每天的秒数),再转换成日期。也可以直接利用date命令直接产生n天前后的日期。

#获取5天前的日期
current_seconds=`date -d now +%s`
fivedaysago_seconds=`expr $current_seconds - 5 \* 86400 `
date -d @$fivedaysago_seconds '+%F %H:%M:%S'
2021-10-23 19:29:17

#获取365天前的日期
date -d '-365 days' '+%F %H:%M:%S'
2020-10-28 19:39:03
#获取180天后的日期
date -d '+180 days' '+%F %H:%M:%S'
2022-04-26 19:39:18
#获取3个月前的日期
date -d '-3 months' '+%F %H:%M:%S'
2021-07-28 19:39:50
#获取1年后的日期
date -d '+1 year' '+%F %H:%M:%S'
2022-10-28 19:40:14

4. 计算日期间隔天数

如上面相同,先计算出要比较的日期从1970-01-01开始计算的秒数,相减后除以86400(每天的秒数)计算出间隔的天数。

date1='2020-10-29 16:51:39'
date2='2021-10-28 10:08:25'

date1s=`date -d "$date1" +%s`
date2s=`date -d "$date2" +%s`

days=`expr \( $date2s - $date1s \) / 86400`
echo "There are $days days between $date1 and ${date2}."

There are 363 days between 2020-10-29 16:51:39 and 2021-10-28 10:08:25.

5. 判断文件是否超期

如上面相同,先计算出当前日期和文件日期从1970-01-01开始计算的秒数,相减后除以86400(每天的秒数)计算出间隔的天数,再根据间隔的天数进行相应的判断。

#判断以日期命名的文件是否超过1年,超过1年以上则进行删除
for file in `ls datedir |grep '^[0-9]\{8\}'`
do
  filetime=`date -d $file`
  if [ $? -eq 0 ]
  then
    datenows=`date -d now +%s`
    datefiles=`date -d $file +%s`
    filelife=`expr \( $datenows - $datefiles \) / 86400 `
    if [ $filelife -gt 365 ]
    then
      echo "$file should be removed."
      rm -f datedir/$file
    fi
  fi
done

#根据文件的实际修改日期进行超期判断,可以通过"touch -m -d 日期"更改文件的修改时间来进行测试
dir='./datedir'
for file in `ls $dir |grep '^[0-9]\{8\}'`
do
  filetime=`date -d $file`
  if [ $? -eq 0 ]
  then
    datenows=`date -d now +%s`
    datefiles=`stat -c %Y $dir/$file`
    filelife=`expr \( $datenows - $datefiles \) / 86400 `
    if [ $filelife -gt 365 ]
    then
      echo "$file should be removed."
      rm -f $dir/$file
    fi
  fi
done

6. 判断日期是否是月末

取当天日期1天后的日期是否为1来进行月末的判断。

DAY=`date -d "now +1 days" +%d`
#DAY=`date -d "2021-10-31 +1 days" +%d`
if [ "$DAY" -eq 1 ]    # if [ "$DAY" = "01" ]
then
  echo "Today is the end of the month."
else
  echo "Today isn't the end of the month."
fi
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值