我rsync
作为一项cron
作业运行并通过conky
(即“上次备份 2017 年 05 月 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"
以下是它决定使用哪个单位的方法:它使用给出的数字至少为二的最大单位。
示例:如果某事发生在 72 小时前,则会以天为单位输出。如果某件事正好发生在一个小时前,则需要几分钟的时间。
答案3
使用 bash,您可以执行类似以下代码的操作:
请注意,您将需要使用sed
或 来将日期字符串重新格式化为date
可接受的格式,例如:
"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 语言中(来自Perl 食谱)你会去:
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。