如何将日期/时间输出为“20 分钟前”或“9 天前”等

Aij*_*lon 6 linux date conky

rsync作为cron作业运行并通过conky(即“上次备份 2017 05 12 14:22:20”)显示上次备份。我想将上次备份显示为"2 days ago""4 hours ago",而不仅仅是显示静态日期戳。

有没有办法使用这种用户友好的输出格式来显示日期/时间?我看过man date,但找不到任何关于以这种格式输出日期的信息。我看到如何使用-d标志查询相对时间或日期,但看不到如何获取日期的输出以包含诸如"yesterday""3 days ago" 等词

谢谢!

Ste*_*nny 8

希望有人有更好的解决方案,但这是我想出的脚本:

#!/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
Run Code Online (Sandbox Code Playgroud)

结果:

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

$ relative.sh 2016-9-23
1 year, 9 months ago
Run Code Online (Sandbox Code Playgroud)

  • 我只是吐了一点。但是太棒了。 (7认同)

Nic*_*ell 5

这是 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"
Run Code Online (Sandbox Code Playgroud)

以下是它决定使用哪个单位的方式:它使用给出至少为两个数字的最大单位。

示例:如果某事发生在 72 小时前,它将以天为单位输出。如果某事恰好在一小时前发生,它将使用分钟。


小智 0

那么在 Perl 语言中(来自Perl Cookbook)你会这样:

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";
Run Code Online (Sandbox Code Playgroud)

并得到:

This is now, then was 3071 days, 0:49:35 ago!
Run Code Online (Sandbox Code Playgroud)

不幸的是,默认情况下该Date::Calc模块并未安装,因此您必须找人安装它,或者自己学习使用 Perl 模块管理器 CPAN。