static moment_t THX_moment_with_day_of_month(pTHX_ const moment_t *mt, IV v) { int y, m; dt_to_ymd(moment_local_dt(mt), &y, &m, NULL); if (v < 1 || v > 28) { int dim = dt_days_in_month(y, m); if (v < 1 || v > dim) croak("Parameter 'day' is out of the range [1, %d]", dim); } return THX_moment_with_local_dt(aTHX_ mt, dt_from_ymd(y, m, (int)v)); }
static moment_t THX_moment_with_month(pTHX_ const moment_t *mt, IV v) { int y, m, d; THX_check_month(aTHX_ v); dt_to_ymd(moment_local_dt(mt), &y, NULL, &d); m = (int)v; if (d > 28) { int dim = dt_days_in_month(y, m); if (d > dim) d = dim; } return THX_moment_with_local_dt(aTHX_ mt, dt_from_ymd(y, m, d)); }
int dt_length_of_month(dt_t dt) { int y, m; dt_to_ymd(dt, &y, &m, NULL); return dt_days_in_month(y, m); }
dt_t dt_end_of_month(dt_t dt, int offset) { int y, m; dt_to_ymd(dt, &y, &m, NULL); return dt_from_ymd(y, m + offset + 1, 0); }
dt_t dt_start_of_month(dt_t dt, int offset) { int y, m; dt_to_ymd(dt, &y, &m, NULL); return dt_from_ymd(y, m + offset, 1); }