Linux 给定时间戳,如何获取 X 天前的时间戳?

day*_*yup 2 linux date

如何使用该date命令并给出时间戳,以获取X几天前的时间戳。例如 UTC 时间戳是1525192000,我想30在这之前几天获得 UTC 时间戳。

the*_*rpy 5

首先,您的时间戳是自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数,这是我的假设,如果不是,请将其转换为。

因此,您必须减去所需天数的秒数。

stamp=1525192000
day=$((60*60*24))
echo $(($stamp - 30*$day))
Run Code Online (Sandbox Code Playgroud)

然后你会得到一个 Unix 纪元时间,如果需要转换为日期和时间,你可能需要考虑 DST,这就是你可能需要使用该date实用程序的地方。

请注意,您也可以使用date. 这使您可以轻松使用其他日期元素,无需计算:

使用 GNU date

date --date="$(date --iso-8601=s -d @1525192000) -30 days" +%s
Run Code Online (Sandbox Code Playgroud)

例子:

 $ date --date="$(date --iso-8601=s -d @1525192000)"
 Tue, May  1, 2018  7:06:01 PM
 $ date --date="$(date --iso-8601=s -d @1525192000) -30 days"
 Wed, Apr 1, 2018  7:06:01 PM
 $ date --date="$(date --iso-8601=s -d @1525192000) -30 days" +%s
 1523466380
 $ date --date="$(date --iso-8601=s -d @1525192000) -30 days -1 week -3 months" +%s
 1514309200
Run Code Online (Sandbox Code Playgroud)

在 FreeBSD 和 macOS 中(-j意思是不要尝试设置系统日期,好用又安全)

date -j -f "%a %b %d %T %Z %Y" "$(date -r 1234567890)"  -v-30d "+%s"
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢,Kusalananda、OpenBSD 和 NetBSD 不支持-v.

  • 请注意,我指的是对您的答案的反对票(目前有一个反对票和一个赞成票(我的,在编辑之前)),而不是问题。请注意,OP 没有对任何日期(“date”实用程序除外)或任何日历进行任何引用。据我们所知,他们可能没有使用公历。 (2认同)