nutools/lib/nulib/awk/base.date.awk

53 lines
1.7 KiB
Awk

# -*- coding: utf-8 mode: awk -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function date__parse_fr(date, parts, y, m, d) {
if (match(date, /([0-9][0-9]?)\/([0-9][0-9]?)\/([0-9][0-9][0-9][0-9])/, parts)) {
y = int(parts[3]);
m = int(parts[2]);
d = int(parts[1]);
return mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d));
} else if (match(date, /([0-9][0-9]?)\/([0-9][0-9]?)\/([0-9][0-9])/, parts)) {
basey = int(strftime("%Y")); basey = basey - basey % 100;
y = basey + int(parts[3]);
m = int(parts[2]);
d = int(parts[1]);
return mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d));
}
return -1;
}
function date__parse_mysql(date, parts, y, m, d) {
if (match(date, /([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])/, parts)) {
y = int(parts[1]);
m = int(parts[2]);
d = int(parts[3]);
return mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d));
}
return -1;
}
function date__parse_any(date, serial) {
serial = date__parse_fr(date);
if (serial == -1) serial = date__parse_mysql(date);
return serial;
}
function date_serial(date) {
return date__parse_any(date);
}
function date_parse(date, serial) {
serial = date__parse_any(date);
if (serial == -1) return date;
return strftime("%d/%m/%Y", serial);
}
function date_monday(date, serial, dow) {
serial = date__parse_any(date);
if (serial == -1) return date;
dow = strftime("%u", serial);
serial -= (dow - 1) * 86400;
return strftime("%d/%m/%Y", serial);
}
function date_add(date, nbdays, serial) {
serial = date__parse_any(date);
if (serial == -1) return date;
serial += nbdays * 86400;
return strftime("%d/%m/%Y", serial);
}