如何通过linux date命令根据相对日期获取相对日期?

如何通过linux date命令根据相对日期获取相对日期?

我可以通过linux date命令得到“基于10分钟前的上周一”吗?

例如

  • 当前时间: 2016-02-09 00:05:00
  • 预期结果:2016-02-01 00:00:00

答案1

如果你有faketime并且你的date是动态链接的:

faketime -f -10m date -d 'last monday' '+%F %T'

使用ksh93(仅限内置命令):

printf '%(%F %T)T\n' "$(printf '%(%Y.%m.%d)T' '10 minutes ago')-0 last monday"

在这里,如果这是最后一次星期日而不是最后一个周一,你可以这样做:

date -d "$(date -d '10 minutes ago' +"%F -%u day")"

或者如果是最后一次周六:

date -d "$(date -d '10 minutes ago' +"%F -%w day -1 day")"

但最后周一或一周中的任何其他一天,它涉及一些算术:

eval "date -d \"$(date -d '10 minutes ago' +'%F -$(((%u+5)%%7+1)) day')\""

否则,您始终可以执行以下操作:

d=$(date -d 'last monday'); sleep 600; printf '%s\n' "$d"

;-)

答案2

您可以通过 2 个日期操作来完成。这是一个快速的 bash shell 脚本:

TIME_TEN_MINUTES_AGO=`date -d '-10 min' +%T`

LAST_MON=`date -d 'last-monday' +%Y-%m-%d`

echo "NOW:      " `date "+%Y-%m-%d %T"`
echo "Last Mon: " $LAST_MON $TIME_TEN_MINUTES_AGO

这打印:

NOW:       2016-02-12 07:54:27
Last Mon:  2016-02-08 07:44:27

答案3

我遇到了类似的问题:给定一个日期,找到上周一。

(用电视上的播放日期重命名节目的视频文件;

DATE=$(youtube-dl -j $VID | awk -F\" '{print $28}')

我在 macOS 上使用 BSD date,并且还安装了 GNU date

这似乎faketime是这个问题最简单的解决方案:

faketime $DATE date -v-mon +%F,

faketime $DATE gdate -d last-mon +%F

只需使用 GNU 即可完成date,但更复杂:

eval "gdate -d \"$(gdate -d $DATE '+%D $[-%u+1] day')\" +%F"

您也可以date仅使用 BSD 来完成此操作,即使它会变得混乱:

date -j -f "%a %d %b %Y %T %Z" "$(date -j -r \ "$(date -j -f "%Y%m%d" "$DATE" +"%s")" -v-mon)" +"%F"

答案4

这是一个小脚本,可以解决 10 分钟前是前一天的问题。我相信它可以做得更优雅:

#!/bin/bash

DAY=`date --date='-10 min' +"%a"`
SEC=`date --date='-10 min' +"%s"`

if [[ "$DAY" == "Mon" ]]; then
    DDIF="7"
elif [[ "$DAY" == "Tue" ]]; then
    DDIF="1"
elif [[ "$DAY" == "Wed" ]]; then
    DDIF="2"
elif [[ "$DAY" == "Thu" ]]; then
    DDIF="3"
elif [[ "$DAY" == "Fri" ]]; then
    DDIF="4"
elif [[ "$DAY" == "Sat" ]]; then
    DDIF="5"
elif [[ "$DAY" == "Sun" ]]; then
    DDIF="6"
fi

EPOCH=$(awk "BEGIN {print $SEC-(86400*$DDIF); exit}")
date -d@"$EPOCH"

它的作用是找出 10 分钟前是哪一天。找出距离星期一有多少天。然后将该天数乘以 86400(一天中的秒数),并从基于 10 分钟前的 Epoch 中减去它。最后它将纪元值转换回标准格式。

就像我说的,不一定简单,一行,或者优雅。

相关内容