Eu tive que fazer isso no passado com análise de força bruta e cálculo no shell script.
Fazê-lo manualmente no shell script é altamente propenso a erros e lento. Você precisa contabilizar dias por mês, anos bissextos e fusos horários. Ele falhará com diferentes idiomas e idiomas diferentes.
Eu consertei um dos meus scripts antigos, isso provavelmente precisaria ser modificado para ambientes de shell diferentes, mas não deve haver nada que não possa ser alterado para funcionar em qualquer shell.
#!/bin/sh
datestring="Nov 28 20:27:19 2012 GMT"
today='date'
function date2epoch {
month=$1
day=$2
time=$3
year=$4
zone=$5
# assume 365 day years
epochtime=$(( (year-1970) * 365 * 24 * 60 * 60 ))
# adjust for leap days
i=1970
while [[ $i -lt $4 ]]
do
if [[ 0 -eq $(( i % 400 )) ]]
then
#echo $i is a leap year
# divisible by 400 is a leap year
epochtime=$((epochtime+24*60*60))
elif [[ 0 -eq $(( i % 100 )) ]]
then
#echo $i is not a leap year
epochtime=$epochtime
elif [[ 0 -eq $(( i % 4 )) ]]
then
#echo $i is a leap year
# divisible by 4 is a leap year
epochtime=$((epochtime+24*60*60))
# epoch='expr $epoch + 24 * 60 * 60'
fi
i=$((i+1))
done
dayofyear=0
for imonth in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
do
if [[ $month == $imonth ]]
then
break
fi
case $imonth in
'Feb')
if [[ 0 -eq $(( year % 400 )) ]]
then
days=29
elif [[ 0 -eq $(( year % 100 )) ]]
then
days=28
elif [[ 0 -eq $(( year % 4 )) ]]
then
days=29
fi
;;
Jan|Mar|May|Jul|Aug|Oct|Dec) days=31 ;;
*) days=30 ;;
esac
#echo $imonth has $days days
dayofyear=$((dayofyear + days))
done
## add the day of the month
dayofyear=$((dayofyear+day))
#echo $dayofyear
########## Add the day fo year (-1) to the epochtime
#(-1, since eg. Jan 1 is not 24 hours into Jan1 )
epochtime=$((epochtime + (dayofyear -1) * 24*60*60))
#echo $epochtime
################## hours, minutes, seconds
OFS=$IFS
IFS=":"
set -- $time
hours=$1
minutes=$2
seconds=$3
epochtime=$((epochtime + (hours * 60 * 60) + (minutes * 60) + seconds))
IFS=$OFS
################## Time zone
case $zone in
'GMT') zonenumber=0
break;;
'EST') zonenumber=-5
break;;
'EDT') zonenumber=-4
break;;
esac
epochtime=$((epochtime + zonenumber * 60 * 60 ))
echo $epochtime
}
result='date2epoch $datestring'
echo $result
Eu provavelmente cometi um erro em algum lugar e pode haver uma maneira melhor. Deixe-me saber se você encontrar um bug ou uma maneira melhor.
Uma vez que você tenha o tempo de época, você pode fazer alguns cálculos úteis ... apesar de converter isso de volta em uma data sem os utilitários do gnu ... requer fazer o acima ao contrário ...