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シェルスクリプトです:

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(1日の秒数)を掛け、10分前を基準にしたEpochからそれを引きます。最後に、epoch値を標準形式に戻します。

私が言ったように、必ずしも単純、一行、またはエレガントである必要はありません。

関連情報