static moment_t THX_moment_with_day_of_quarter(pTHX_ const moment_t *mt, IV v) { int y, q; dt_to_yqd(moment_local_dt(mt), &y, &q, NULL); if (v < 1 || v > 90) { int diq = dt_days_in_quarter(y, q); if (v < 1 || v > diq) croak("Parameter 'day' is out of the range [1, %d]", diq); } return THX_moment_with_local_dt(aTHX_ mt, dt_from_yqd(y, q, (int)v)); }
int dt_length_of_quarter(dt_t dt) { int y, q; dt_to_yqd(dt, &y, &q, NULL); return dt_days_in_quarter(y, q); }
dt_t dt_end_of_quarter(dt_t dt, int offset) { int y, q; dt_to_yqd(dt, &y, &q, NULL); return dt_from_yqd(y, q + offset + 1, 0); }
dt_t dt_start_of_quarter(dt_t dt, int offset) { int y, q; dt_to_yqd(dt, &y, &q, NULL); return dt_from_yqd(y, q + offset, 1); }