날짜/시간을 "20분 전" 또는 "9일 전" 등으로 출력하는 방법

날짜/시간을 "20분 전" 또는 "9일 전" 등으로 출력하는 방법

나는 그것을 직업 rsync으로 실행 cron하고 통과했습니다 conky(예 :"마지막 백업 날짜: 2017년 5월 12일 14:22:20"). 마지막 백업을 다음과 같이 표시하고 싶습니다."2일 전"또는"4 시간 전에", 단순히 정적 날짜 스탬프를 표시하는 것이 아니라

이 사용자 친화적인 출력 형식을 사용하여 날짜/시간을 표시하는 방법이 있습니까? 찾아봤지만 man date이 형식으로 날짜를 출력하는 방법에 대한 정보를 찾을 수 없습니다. 플래그를 사용하여 상대 시간이나 날짜를 쿼리하는 방법을 이해 -d하지만 날짜 출력에 다음과 같은 단어를 포함하는 방법을 알 수 없습니다."어제","3일 전" 등.

감사해요!

답변1

누군가가 더 나은 솔루션을 갖고 있기를 바라지만, 제가 생각해낸 스크립트는 다음과 같습니다.

#!/bin/sh
cd /tmp
git init -q
git -c user.email=0 -c user.name=0 commit -q -m 0 --allow-empty --date="$1"
git show --format=%ar

결과:

$ relative.sh 2016-1-23
2 years, 5 months ago

$ relative.sh 2016-9-23
1 year, 9 months ago

답변2

이것은 초/분/일/월/년을 사용하여 작동하는 the_velour_fog 답변의 확장입니다.

#!/usr/bin/env bash

last_run="2018-06-21T21:10:18-06:00"


function rel_fmt_low_precision() {
    local SEC_PER_MINUTE=$((60))
    local   SEC_PER_HOUR=$((60*60))
    local    SEC_PER_DAY=$((60*60*24))
    local  SEC_PER_MONTH=$((60*60*24*30))
    local   SEC_PER_YEAR=$((60*60*24*365))

    local last_unix="$(date --date="$1" +%s)"    # convert date to unix timestamp
    local now_unix="$(date +'%s')"

    local delta_s=$(( now_unix - last_unix ))

    if (( delta_s <  SEC_PER_MINUTE * 2))
    then
        echo "last run "$((delta_s))" seconds ago"
        return 
    elif (( delta_s <  SEC_PER_HOUR * 2))
    then
        echo "last run "$((delta_s / SEC_PER_MINUTE))" minutes ago"
        return 
    elif (( delta_s <  SEC_PER_DAY * 2))
    then
        echo "last run "$((delta_s / SEC_PER_HOUR))" hours ago"
        return 
    elif (( delta_s <  SEC_PER_MONTH * 2))
    then
        echo "last run "$((delta_s / SEC_PER_DAY))" days ago"
        return 
    elif (( delta_s <  SEC_PER_YEAR * 2))
    then
        echo "last run "$((delta_s / SEC_PER_MONTH))" months ago"
        return 
    else
        echo "last run "$((delta_s / SEC_PER_YEAR))" years ago"
        return 
    fi
}

rel_fmt_low_precision "`date`"
rel_fmt_low_precision "2018-06-21 21:10:18"
rel_fmt_low_precision "2018-06-21 20:10:18"
rel_fmt_low_precision "2018-05-21 21:10:18"
rel_fmt_low_precision "2017-06-21 20:10:18"
rel_fmt_low_precision "2016-06-21 20:10:18"

사용할 단위를 결정하는 방법은 다음과 같습니다. 주어진 숫자가 2 이상인 가장 큰 단위를 사용합니다.

예: 72시간 전에 발생한 일이면 며칠 안에 출력됩니다. 정확히 한 시간 전에 무슨 일이 일어났다면 몇 분이 걸립니다.

답변3

Bash를 사용하면 다음 코드와 같은 작업을 수행할 수 있습니다. 날짜 문자열을 사용하거나 허용 가능한 형식 으로 다시 포맷
해야 합니다 . 예를 들면 다음과 같습니다.seddate

"2017-05-13 15:44:20"
#!/usr/bin/env bash

last_run="2017-05-13 15:44:20"


function relative() {
    local last_unix="$(date --date="$1" +%s)"    # convert date to unix timestamp
    local now_unix="$(date +'%s')"

    local delta=$(( $now_unix - $last_unix ))

    if (( $delta < 60 )) 
    then
        echo "last run "$delta" seconds ago"
        return 
    elif ((delta < 2700))  # 45 * 60
    then
        echo "last run "$(( $delta / 60 ))" minutes ago";
    fi
}

relative "$last_run"

답변4

음, Perl 언어로(from펄 레시피) 당신은 다음으로 갈 것입니다 :

use Date::Calc qw(Delta_DHMS);
@now = ( 1981, 6, 16, 4, 35, 25 ); # 16 June 1981 4:35:25
@then =( 1973, 1, 18, 3, 45, 50 ); # 18 January 1973 3:45:50

@diff = Delta_DHMS( @then, @now );

print "This is now, then was $diff[0] days, $diff[1]:$diff[2]:$diff[3] ago!\n";

그리고 얻다:

This is now, then was 3071 days, 0:49:35 ago!

불행하게도 이 Date::Calc모듈은 기본적으로 설치되지 않으므로 설치할 사람을 찾거나 Perl 모듈 관리자 CPAN 사용법을 직접 배워야 합니다.

관련 정보