106 lines
2.5 KiB
Awk
106 lines
2.5 KiB
Awk
# mktime.awk --- convert a canonical date representation
|
|
# into a timestamp
|
|
# Arnold Robbins, arnold@gnu.org, Public Domain
|
|
# May 1993
|
|
|
|
BEGIN \
|
|
{
|
|
# Initialize table of month lengths
|
|
_tm_months[0,1] = _tm_months[1,1] = 31
|
|
_tm_months[0,2] = 28; _tm_months[1,2] = 29
|
|
_tm_months[0,3] = _tm_months[1,3] = 31
|
|
_tm_months[0,4] = _tm_months[1,4] = 30
|
|
_tm_months[0,5] = _tm_months[1,5] = 31
|
|
_tm_months[0,6] = _tm_months[1,6] = 30
|
|
_tm_months[0,7] = _tm_months[1,7] = 31
|
|
_tm_months[0,8] = _tm_months[1,8] = 31
|
|
_tm_months[0,9] = _tm_months[1,9] = 30
|
|
_tm_months[0,10] = _tm_months[1,10] = 31
|
|
_tm_months[0,11] = _tm_months[1,11] = 30
|
|
_tm_months[0,12] = _tm_months[1,12] = 31
|
|
}
|
|
# decide if a year is a leap year
|
|
function _tm_isleap(year, ret)
|
|
{
|
|
ret = (year % 4 == 0 && year % 100 != 0) ||
|
|
(year % 400 == 0)
|
|
|
|
return ret
|
|
}
|
|
# convert a date into seconds
|
|
function _tm_addup(a, total, yearsecs, daysecs,
|
|
hoursecs, i, j)
|
|
{
|
|
hoursecs = 60 * 60
|
|
daysecs = 24 * hoursecs
|
|
yearsecs = 365 * daysecs
|
|
|
|
total = (a[1] - 1970) * yearsecs
|
|
|
|
# extra day for leap years
|
|
for (i = 1970; i < a[1]; i++)
|
|
if (_tm_isleap(i))
|
|
total += daysecs
|
|
|
|
j = _tm_isleap(a[1])
|
|
for (i = 1; i < a[2]; i++)
|
|
total += _tm_months[j, i] * daysecs
|
|
|
|
total += (a[3] - 1) * daysecs
|
|
total += a[4] * hoursecs
|
|
total += a[5] * 60
|
|
total += a[6]
|
|
|
|
return total
|
|
}
|
|
# mktime --- convert a date into seconds,
|
|
# compensate for time zone
|
|
|
|
function mktime(str, res1, res2, a, b, i, j, t, diff)
|
|
{
|
|
i = split(str, a, " ") # don't rely on FS
|
|
|
|
if (i != 6)
|
|
return -1
|
|
|
|
# force numeric
|
|
for (j in a)
|
|
a[j] += 0
|
|
|
|
# validate
|
|
if (a[1] < 1970 ||
|
|
a[2] < 1 || a[2] > 12 ||
|
|
a[3] < 1 || a[3] > 31 ||
|
|
a[4] < 0 || a[4] > 23 ||
|
|
a[5] < 0 || a[5] > 59 ||
|
|
a[6] < 0 || a[6] > 60 )
|
|
return -1
|
|
|
|
res1 = _tm_addup(a)
|
|
t = strftime("%Y %m %d %H %M %S", res1)
|
|
|
|
if (_tm_debug)
|
|
printf("(%s) -> (%s)\n", str, t) > "/dev/stderr"
|
|
|
|
split(t, b, " ")
|
|
res2 = _tm_addup(b)
|
|
|
|
diff = res1 - res2
|
|
|
|
if (_tm_debug)
|
|
printf("diff = %d seconds\n", diff) > "/dev/stderr"
|
|
|
|
res1 += diff
|
|
|
|
return res1
|
|
}
|
|
BEGIN {
|
|
if (_tm_test) {
|
|
printf "Enter date as yyyy mm dd hh mm ss: "
|
|
getline _tm_test_date
|
|
t = mktime(_tm_test_date)
|
|
r = strftime("%Y %m %d %H %M %S", t)
|
|
printf "Got back (%s)\n", r
|
|
}
|
|
}
|