/
ydate.sh
127 lines (110 loc) · 2.91 KB
/
ydate.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/bin/sh
# vim: set ts=2 sw=2 sts=2 et si ai:
# ydate.sh
# =-=
# This software is Free Software; it can be redistributed under the same terms as BSD Licence.
# All rights reserved.
#
# Authors
# Carlos Aquiles < (at) mail.com>
# PetrOHS <petrohs(at) mail.com>
# Maintainer
# Andres Aquino <andres.aquino(at) mail.com>
#
# getNumberDay
# Get a number day taking the Gregorian Calendar as a baseline
# Params:
# getNumberDay( integer year,
# integer month,
# integer day )
# Returns:
# integer NumberDay
#
function getNumberDay () {
local year=${1}
local month=${2}
local day=${3}
local number=
# values in range year > 0 || month > 0 || day > 0 => exit 1
[ ${year} -le 0 -o ${month} -le 0 -o ${day} -le 0 ] && exit 1
month=$(((month+9)%12))
year=$((year-(month/10)))
number=$(((365*year) + (year/4) - (year/100) + (year/400) + (month*306 + 5)/10 + (day -1)))
echo $number
}
# getDayOfNumber
# Get a date from a NumberDay generated by getNumberDay function
# Params:
# getDayOfNumber ( integer numberDay )
# Returns:
# string dateCalculated
#
function getDayOfNumber () {
local number=${1}
local year=
local month=
local day=
year=$(((10000*number+14780)/3652425))
day=$((number-((365*year)+(year/4)-(year/100)+(year/400))))
if [ ${day} -lt 0 ]
then
year=$((year-1))
day=$((number-((365*year)+(year/4)-(year/100)+(year/400))))
fi
ydays=$((((100*day)+52)/3060))
month=$((((ydays+2)%12)+1))
year=$((year+(ydays+2)/12))
day=$((day-((ydays*306+5)/10)+1))
# formatting
month=`echo "0000${month}" | rev | cut -c-2 | rev`
day=`echo "0000${day}" | rev | cut -c-2 | rev`
echo "${year}${month}${day}"
}
# sdate.sh
# Params:
# -d by default -1 day
# --days=-+N move N days back or forward
# -h | --help show help
#
while [ $# -gt 0 ]
do
case ${1} in
-d)
# opcion por defecto (-1)
days=-1
;;
--days| --days=*)
# corrimiento de dias (+-N)
days=`echo "${1}" | sed 's/^--days[=]*//'`
[ ${#days} -eq 0 ] && days=-1
;;
-h|--help)
echo -e "Usage: ydate [OPTIONS]..."
echo -e "Calculate a date in the timeline by taking +-N days as parameter"
echo -e "Mandatory arguments:"
echo -e "\t-d, --days=+N|-N by default -1 day, otherwise +-N days"
echo -e "\t-h, --help show help"
echo -e "Report bugs to <petrohs(at) mail.com>"
exit 0
;;
*)
# opcion por defecto (-1)
echo -e "Option not recognized, please check your parameters."
echo -e "ydate --help"
exit 0
;;
esac
shift
done
# get current date
nyear=`date '+%Y'`
nmonth=`date '+%m'`
nday=`date '+%d'`
# get number day
numberday=$(getNumberDay "${nyear}" "${nmonth}" "${nday}")
# apply n shift days
numberday=$((numberday+(days)))
# and finally, get a date
getDayOfNumber "${numberday}"
# "Compartir es bueno"
exit 0;