moment_t THX_moment_new(pTHX_ IV Y, IV M, IV D, IV h, IV m, IV s, IV ns, IV offset) { moment_t r; int64_t rdn, sod; THX_check_year(aTHX_ Y); THX_check_month(aTHX_ M); if (D < 1 || D > 28) { int dim = dt_days_in_month(Y, M); if (D < 1 || D > dim) croak("Parameter 'day' is out of the range [1, %d]", dim); } THX_check_hour(aTHX_ h); THX_check_minute(aTHX_ m); THX_check_second(aTHX_ s); THX_check_nanosecond(aTHX_ ns); THX_check_offset(aTHX_ offset); rdn = dt_rdn(dt_from_ymd(Y, M, D)); sod = h * 3600 + m * 60 + s; r.sec = rdn * SECS_PER_DAY + sod; r.nsec = ns; r.offset = offset; return r; }
static moment_t THX_moment_with_local_dt(pTHX_ const moment_t *mt, const dt_t dt) { moment_t r; int64_t sod, rdn; sod = moment_local_rd_seconds(mt) % SECS_PER_DAY; rdn = dt_rdn(dt); r.sec = sod + rdn * SECS_PER_DAY; r.nsec = mt->nsec; r.offset = mt->offset; THX_moment_check_self(aTHX_ &r); return r; }
static moment_t THX_moment_plus_months(pTHX_ const moment_t *mt, int64_t v) { int64_t sod, rdn; moment_t r; THX_check_unit_months(aTHX_ v); sod = moment_local_rd_seconds(mt) % SECS_PER_DAY; rdn = dt_rdn(dt_add_months(moment_local_dt(mt), (int)v, DT_LIMIT)); r.sec = sod + rdn * SECS_PER_DAY; r.nsec = mt->nsec; r.offset = mt->offset; THX_moment_check_self(aTHX_ &r); return r; }
static int parse_string_strict(const char *str, size_t len, int64_t *sp, IV *np, IV *op) { size_t n; dt_t dt; int sod, nanosecond, offset; bool extended; n = dt_parse_iso_date(str, len, &dt); if (!n || n == len) return 1; /* * 0123456789 * 2012-12-14 */ extended = str[4] == '-'; if (str[n++] != 'T') return 1; str += n; len -= n; if (extended) n = dt_parse_iso_time_extended(str, len, &sod, &nanosecond); else n = dt_parse_iso_time_basic(str, len, &sod, &nanosecond); if (!n || n == len) return 1; str += n; len -= n; if (extended) n = dt_parse_iso_zone_extended(str, len, &offset); else n = dt_parse_iso_zone_basic(str, len, &offset); if (!n || n != len) return 1; *sp = ((int64_t)dt_rdn(dt) - 719163) * 86400 + sod - offset * 60; *np = nanosecond; *op = offset; return 0; }
int main() { int i, ntests; ntests = sizeof(tests) / sizeof(*tests); for (i = 0; i < ntests; i++) { const struct test t = tests[i]; { dt_t got = dt_rdn(dt_from_ywd(t.y, t.w, t.d)); cmp_ok(got, "==", t.rdn, "dt_rdn(dt_from_ywd(%d, %d, %d))", t.y, t.w, t.d); } { int y, w, d; dt_to_ywd(dt_from_rdn(t.rdn), &y, &w, &d); if (!ok((y == t.y && w == t.w && d == t.d), "dt_to_ywd(dt_from_rdn(%d))", t.rdn)) { diag(" got: %.4d-W%.2d-%d", y, w, d); diag(" exp: %.4d-W%.2d-%d", t.y, t.w, t.d); } } { int got = dt_woy(dt_from_rdn(t.rdn)); cmp_ok(got, "==", t.w, "dt_woy(dt_from_rdn(%d))", t.rdn); } { int got = dt_yow(dt_from_rdn(t.rdn)); cmp_ok(got, "==", t.y, "dt_yow(dt_from_rdn(%d))", t.rdn); } { int got = dt_dow(dt_from_rdn(t.rdn)); cmp_ok(got, "==", t.d, "dt_dow(dt_from_rdn(%d))", t.rdn); } { ok(dt_valid_ywd(t.y, t.w, t.d), "dt_valid_ywd(%d, %d, %d)", t.y, t.w, t.d); } } done_testing(); }
static int parse_string_lenient(const char *str, size_t len, int64_t *sp, IV *np, IV *op) { size_t n; dt_t dt; char c; int sod, nanosecond, offset; n = dt_parse_iso_date(str, len, &dt); if (!n || n == len) return 1; c = str[n++]; if (!(c == 'T' || c == 't' || c == ' ')) return 1; str += n; len -= n; n = dt_parse_iso_time(str, len, &sod, &nanosecond); if (!n || n == len) return 1; if (str[n] == ' ') n++; str += n; len -= n; n = dt_parse_iso_zone_lenient(str, len, &offset); if (!n || n != len) return 1; *sp = ((int64_t)dt_rdn(dt) - 719163) * 86400 + sod - offset * 60; *np = nanosecond; *op = offset; return 0; }