날짜를 초 또는 일로 변환

날짜를 초 또는 일로 변환

날짜를 일수로 변환해야 합니다.

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

637027200

두 번째 숫자를 얻으려면. 그런 다음 그 숫자를 하루의 초 수인 86400으로 나눴습니다.

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

7373

하지만 1970년 1월 1일 이전 날짜에는 작동하지 않습니다.

1950년에서 2020년 사이의 날짜를 사용해야 합니다.

해결책이 있나요? 어쩌면 1970년 1월 1일과 다른 날짜로 신기원 시간을 재정의할 수 있는 날짜 바이너리가 있을까요?

답변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일을 8진수 값으로 처리합니다.)

관련 정보