Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
File: ywd.c Project: chansen/c-dt
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();
}
Example #6
0
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;
}