我需要将日期转换为天数,我可以使用
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) ))
(注意:一定要使用%-j
and not %j
,否则 bash 会因为前导 0 将一年的前 99 天视为八进制值。)