我想创建一个名为Age的命令,它调用这个脚本:
From=$(stat / | grep "Birth" | sed 's/Birth: //g' | cut -b 2-11)
echo $From
Now=$(date)
echo $Now但是,我不得不减去这两次约会。
我如何才能减去它们,并确保它不像2022-05-07和2022-07-05那样混乱的日期时间?我是说,哪一个月,哪个日期?
我认为我应该更改stat命令的格式,使其更具描述性,以避免这种混淆,然后确保这两个日期都是相同的格式,然后减去它们。但我找不到方法。
发布于 2023-01-15 10:23:49
This的答案是错的!应根据秒数手动计算差异。使用 date显示的command只显示一天的月份、日数,这是从 1970-01-01**.**到的那么多秒。
我会这样做:
#!/bin/bash
d1=$(date -d "$(stat / | grep "Birth" | sed 's/Birth: //g')" +%s)
d2=$(date +%s)
date -d "@$(($d2 - $d1))" +'%m months, %d days, %H hours'两次都用几秒钟。减去它们并以您选择的格式显示它们。在这种情况下,是几个月、几天、几个小时。您可以将其更改为首选项。试试man date,看看输出格式有哪些选项。
关于日期格式的混淆YYYY DD,我从未见过计算机会错误地将其解释为YYYY。
根据muru的评论添加(oneliner):
date -d "@$(($(date +%s) - $(stat / --format %W)))" +'%m months, %d days, %H hours'Addition @Saeed Neamati评论。下面的答案提供了更好的解决方案。它们仍然不能百分之百正确。
First选项如果计算差异,然后将该差异添加到1970-01-01,则可以以年、月和日显示1970-01-01年之间的差异。由于月份长短不同,而且由于闰年,结果并不准确:
seconds=$(date -d "@$(($(date +%s) - $(stat / --format %W)))" +%s)
years=$(($(date -d @$seconds +%Y) - 1970))
months=$(($(date -d @$seconds +%m) - 1))
days=$(($(date -d @$seconds +%d)))
echo $years years, $months months, $days daysSecond选项另一种方法是获取两个日期并计算它们之间的差异。日子可能不对,因为并非所有的月份都是31天:
d1_year=$(date -d @$(stat / --format %W) +%Y)
d1_month=$(date -d @$(stat / --format %W) +%-m)
d1_day=$(date -d @$(stat / --format %W) +%-d)
d2_year=$(date +%Y)
d2_month=$(date +%-m)
d2_day=$(date +%-d)
years=$(($d2_year - $d1_year))
months=$(($d2_month - $d1_month))
if (( $months < 0 )); then
months=$(($months + 12))
years=$(($years - 1))
fi
days=$((d2_day - $d1_day))
if (( $days < 0 )); then
days=$(($days + 31))
months=$((months -1))
fi
echo $years years, $months months, $days days发布于 2023-01-23 15:02:32
2022-05-07,与05/07/22或07/05/2022相反,是一种明确的标准日期格式,总是YYYY DD。但是,在这里,您不需要解析日历日期时间,您可以将原始数据作为从时代开始的几秒钟来获取。
使用GNU stat (最近够了,以及最近的glibc和Linux内核,因此它报告了出生时间)和dateutils ( Debian和衍生工具中的dateutils.ddiff)的ddiff命令:
ddiff -i %s -f %d "$(stat -c%W /)" now或者近似地说,一天是86400秒(它们是86400 Unix秒,但由于某些时区的DST,计算可能会在极少数情况下中断一天):
echo "$(( ($(date +%s) - $(stat -c%W /)) / 86400 ))"使用zmodload zsh/datetime后的zsh或bash的最新版本,$(date +%s)可以替换为$EPOCHSECONDS。
使用ts,使用-r可以解析时间戳并将它们转换为某种61d25m ago / 166d7h ago格式。它识别了许多时间戳格式,包括ISO-8600格式,因此您需要稍微转换stat的S输出,并获得UTC时间,因为我不认为ts解释了时区部分:
TZ=UTC0 stat -c%w / |
sed 's/ /T/;s/ .*/Z/' |
ts -r或者使用GNU find而不是stat和TZ=UTC0 find / -prune -printf '%BFT%BTZ\n'从一开始就以正确的格式获得时间戳(同样,需要一个最新版本的findutils、glibc、Linux)。
https://unix.stackexchange.com/questions/731826
复制相似问题