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

비슷한 문제가 있었습니다. 날짜가 주어지면 지난 월요일을 찾으세요.

(TV의 방송 날짜로 프로그램의 비디오 파일 이름을 바꾸십시오.

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에서 이를 뺍니다. 마지막으로 epoch 값을 다시 표준 형식으로 변환합니다.

내가 말했듯이 반드시 단순하거나, 한 줄이거나, 우아할 필요는 없습니다.

관련 정보