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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值