将日期转换为秒数或天数

将日期转换为秒数或天数

我需要将日期转换为天数,我可以使用

date +%s --date "10 March 1990"

637027200

以获得第二个数字。然后我将该数字除以一天的秒数 - 86400

date +%s --date "10 March 1990" / 86400

7373

但它不适用于 1970 年 1 月 1 日之前的日期

我需要使用 1950 年至 2020 年之间的日期

有什么解决办法吗?也许有一些日期二进制文件允许将纪元时间重新定义为与 1/1/1970 不同的日期?

答案1

纪元日期是固定的。由于您需要从 1950 年开始执行操作,因此可以使用 32 位 Unix 时间。

即使数字为负数,您也可以将两个句点相加。

从 1950 年到 1970 年+从 1970 年至今:

#Get the current date time timestamp
d1="$(date +%s)"
#Get the timestamp from <date> to 1970 and remove negative sign
d2="$(date +%s --date "10 March 1950" | sed 's/-//g')"
#Perform addition of both timestamps
res="$((d1+d2))"
echo "$res"  # Output 2235228403

答案2

另一种方法:从1950年开始,前面有0天,只需添加每年的天数作为起始值。它可能看起来像:

创建包含前几年每年天数总和的数组:

#!/bin/bash
ndays[1950]=0
for i in {1951..2020} ; do
    ndays[i]=$(( ${ndays[i-1]}+$(date +%j --date "31 dec $((i-1))" ) ))
done
  

现在,您的新日期 ID 只是起始值(自 1950 年以来所有往年的天数总和)和当前日期的年份。

date="22 May 1975"
year=$(cut -d' ' -f3 <<<$date)
dayID=$(( ${ndays[year]} + $(date --date "$date" +%-j) ))

(注意:一定要使用%-jand not %j,否则 bash 会因为前导 0 将一年的前 99 天视为八进制值。)

相关内容