我可以通过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 中减去它。最后它将纪元值转换回标准格式。
就像我说的,不一定简单,一行,或者优雅。