Some answers...
Enjoy!
int z_getYear(date zd_date)
{
return (int) gsub(substr((string) zd_date, '/[0-9]+ '), '[^0-9]', '');
}
int z_getMonth(date zd_date)
{
return (int) substr((string) zd_date, '[0-9]+');
}
int z_getDay(date zd_date)
{
return (int) gsub(substr((string) zd_date, '/[0-9]+/'), '/', '');
}
int z_getHour(date zd_date)
{
return (int) substr((string) zd_date, 11, 2);
}
int z_getMinute(date zd_date)
{
return (int) substr((string) zd_date, 14, 2);
}
int z_getSecond(date zd_date)
{
return (int) substr((string) zd_date, 17, 2);
}
int z_getWeekday(date zd_date, ...)
{
string zs_metodo;
zs_metodo = "z_getWeekday";
int zi_depurar;
if (argc>1) zi_depurar = (int) argv[1];
if (argc>2) zs_metodo = format("%s %s", argv[2], zs_metodo);
if (zi_depurar > 0) logf(SIGNIFICANT, "%s Consultando dia, mes e ano...", zs_metodo);
int month, year, day;
day = z_getDay(zd_date);
month = z_getMonth(zd_date);
year = z_getYear(zd_date);
if (zi_depurar > 0) logf(SIGNIFICANT, "%s Calculando dia da semana...", zs_metodo);
float a, b, c, d, e, f, g, h, i, r;
a = (12 - month) / 10;
b = year - a;
c = month + (12 * a);
d = (int) b / 100;
e = d / 4;
f = e + 2 - d;
g = (int) (((float) 365 + (float) 1/4) * b);
h = (int) (((float) 30 + (float) 6001/10000) * (c+1));
i = f + g + h + day + 5;
r = (int) i % 7 - 1;
if (zi_depurar > 0) {
string zs_weekday;
switch (r)
{
case 0: zs_weekday = "Domingo"; break;
case 1: zs_weekday = "Segunda"; break;
case 2: zs_weekday = "Terça"; break;
case 3: zs_weekday = "Quarta"; break;
case 4: zs_weekday = "Quinta"; break;
case 5: zs_weekday = "Sexta"; break;
case 6: zs_weekday = "Sábado"; break;
}
logf(SIGNIFICANT, "%s Retorno: '%s' = '%s'", zs_metodo, zd_date, zs_weekday);
}
return r;
}
string z_getDateToString(date zd_date, ...)
{
string zs_metodo;
zs_metodo = "z_getDateToString";
int zi_depurar;
if (argc>1) zi_depurar = (int) argv[1];
if (argc>2) zs_metodo = format("%s %s", argv[2], zs_metodo);
string zs_regex_date;
zs_regex_date = '[0-9]+/[0-9]+/[0-9]+';
if (zi_depurar > 0) {
logf(SIGNIFICANT, "%s REGEX date : '%s'", zs_metodo, zs_regex_date);
logf(SIGNIFICANT, "%s Date OLD : '%s'", zs_metodo, zd_date);
}
string zs_date_new;
zs_date_new = substr((string) zd_date, zs_regex_date);
if (zi_depurar > 0) {
logf(SIGNIFICANT, "%s Date NEW : '%s'", zs_metodo, zs_date_new);
}
return zs_date_new;
}
date z_getEasterDay(int zi_year, ...)
{
string zs_metodo;
zs_metodo = "z_getEasterDay";
int zi_depurar;
if (argc>1) zi_depurar = (int) argv[1];
if (argc>2) zs_metodo = format("%s %s", argv[2], zs_metodo);
if (zi_depurar > 0) logf(SIGNIFICANT, "%s Calculando dia da pascoa...", zs_metodo);
float a, b, c, d, e, f, g, h, i, k, l, m, p, q;
a = zi_year % 19;
b = zi_year / 100;
c = zi_year % 100;
d = (int) (b / 4);
e = ((int) b) % 4;
f = (int) ((b + 8) / 25);
g = (int) ((1 + b - f) / 3);
h = (int) (((19 * a) + b + 15 - (d + g))) % 30;
i = (int) (c / 4);
k = (int) c % 4;
l = (int) ((32 + (2 * e) + (2 * i) - (h + k))) % 7;
m = (int) ((a + (11 * h) + (22 * l)) / 451);
p = (int) ((h + l + 114 - (7 * m)) / 31);
q = (int) ((h + l + 114 - (7 * m))) % 31;
date zd_easter;
zd_easter = (date) format("%d/%d/%d 00:00:00", p, q+1, zi_year);
if (zi_depurar > 0) logf(SIGNIFICANT, "%s Retorno: %d = '%s'", zs_metodo, zi_year, zd_easter);
return zd_easter;
}
string z_getHolidaysBrazil(int zi_year, ...)
{
string zs_metodo;
zs_metodo = "z_getHolidaysBrazil";
int zi_depurar;
if (argc>1) zi_depurar = (int) argv[1];
if (argc>2) zs_metodo = format("%s %s", argv[2], zs_metodo);
enum {LINES=20, SEGS_DIA=86400};
date zd_holiday_fixed[LINES], zd_easter;
zd_easter = z_getEasterDay(zi_year, zi_depurar, zs_metodo);
int zi_l;
zi_l = -1;
if (zi_depurar > 0) logf(SIGNIFICANT, "%s Preenchendo matriz de feriados fixos e moveis...", zs_metodo);
zi_l++; zd_holiday_fixed[zi_l] = (date) format("01/01/%d 00:00:00", zi_year);
zi_l++; zd_holiday_fixed[zi_l] = (date) format("02/02/%d 00:00:00", zi_year);
zi_l++; zd_holiday_fixed[zi_l] = (date) ((int) zd_easter - (47 * SEGS_DIA));
zi_l++; zd_holiday_fixed[zi_l] = (date) ((int) zd_easter - (2 * SEGS_DIA));
zi_l++; zd_holiday_fixed[zi_l] = zd_easter;
zi_l++; zd_holiday_fixed[zi_l] = (date) format("04/21/%d 00:00:00", zi_year);
zi_l++; zd_holiday_fixed[zi_l] = (date) format("05/01/%d 00:00:00", zi_year);
zi_l++; zd_holiday_fixed[zi_l] = (date) ((int) zd_easter + (60 * SEGS_DIA));
zi_l++; zd_holiday_fixed[zi_l] = (date) format("09/07/%d 00:00:00", zi_year);
zi_l++; zd_holiday_fixed[zi_l] = (date) format("09/20/%d 00:00:00", zi_year);
zi_l++; zd_holiday_fixed[zi_l] = (date) format("10/12/%d 00:00:00", zi_year);
zi_l++; zd_holiday_fixed[zi_l] = (date) format("11/02/%d 00:00:00", zi_year);
zi_l++; zd_holiday_fixed[zi_l] = (date) format("11/15/%d 00:00:00", zi_year);
zi_l++; zd_holiday_fixed[zi_l] = (date) format("12/25/%d 00:00:00", zi_year);
zi_l++;
string zs_holidays;
zs_holidays = '';
int zi_i;
for (zi_i=0; zi_i<zi_l; zi_i++) {
if (zi_depurar > 0) logf(SIGNIFICANT, "%s '%s'", zs_metodo, zd_holiday_fixed[zi_i]);
zs_holidays += format("%s {} ", z_getDateToString(zd_holiday_fixed[zi_i], zi_depurar, zs_metodo));
}
if (zi_depurar > 0) logf(SIGNIFICANT, "%s Feriados: '%s'", zs_metodo, zs_holidays);
return zs_holidays;
}