date 2.0.0 → 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/date/date_core.c +415 -147
- data/ext/date/date_parse.c +103 -82
- data/ext/date/date_strptime.c +2 -4
- data/ext/date/prereq.mk +5 -1
- data/ext/date/zonetab.h +1364 -697
- data/ext/date/zonetab.list +146 -0
- data/lib/date.rb +4 -0
- metadata +4 -18
data/ext/date/date_core.c
CHANGED
@@ -11,6 +11,7 @@
|
|
11
11
|
#include <sys/time.h>
|
12
12
|
#endif
|
13
13
|
|
14
|
+
#undef NDEBUG
|
14
15
|
#define NDEBUG
|
15
16
|
#include <assert.h>
|
16
17
|
|
@@ -22,6 +23,7 @@
|
|
22
23
|
|
23
24
|
static ID id_cmp, id_le_p, id_ge_p, id_eqeq_p;
|
24
25
|
static VALUE cDate, cDateTime;
|
26
|
+
static VALUE eDateError;
|
25
27
|
static VALUE half_days_in_day, day_in_nanoseconds;
|
26
28
|
static double positive_inf, negative_inf;
|
27
29
|
|
@@ -54,6 +56,14 @@ static double positive_inf, negative_inf;
|
|
54
56
|
static VALUE date_initialize(int argc, VALUE *argv, VALUE self);
|
55
57
|
static VALUE datetime_initialize(int argc, VALUE *argv, VALUE self);
|
56
58
|
|
59
|
+
#define RETURN_FALSE_UNLESS_NUMERIC(obj) if(!RTEST(rb_obj_is_kind_of((obj), rb_cNumeric))) return Qfalse
|
60
|
+
inline static void
|
61
|
+
check_numeric(VALUE obj, const char* field) {
|
62
|
+
if(!RTEST(rb_obj_is_kind_of(obj, rb_cNumeric))) {
|
63
|
+
rb_raise(rb_eTypeError, "invalid %s (not numeric)", field);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
57
67
|
inline static int
|
58
68
|
f_cmp(VALUE x, VALUE y)
|
59
69
|
{
|
@@ -2470,6 +2480,7 @@ date_s_valid_jd_p(int argc, VALUE *argv, VALUE klass)
|
|
2470
2480
|
|
2471
2481
|
rb_scan_args(argc, argv, "11", &vjd, &vsg);
|
2472
2482
|
|
2483
|
+
RETURN_FALSE_UNLESS_NUMERIC(vjd);
|
2473
2484
|
argv2[0] = vjd;
|
2474
2485
|
if (argc < 2)
|
2475
2486
|
argv2[1] = INT2FIX(DEFAULT_SG);
|
@@ -2545,9 +2556,12 @@ date_s__valid_civil_p(int argc, VALUE *argv, VALUE klass)
|
|
2545
2556
|
* Date.valid_date?(year, month, mday[, start=Date::ITALY]) -> bool
|
2546
2557
|
*
|
2547
2558
|
* Returns true if the given calendar date is valid, and false if not.
|
2559
|
+
* Valid in this context is whether the arguments passed to this
|
2560
|
+
* method would be accepted by ::new.
|
2548
2561
|
*
|
2549
2562
|
* Date.valid_date?(2001,2,3) #=> true
|
2550
2563
|
* Date.valid_date?(2001,2,29) #=> false
|
2564
|
+
* Date.valid_date?(2001,2,-1) #=> true
|
2551
2565
|
*
|
2552
2566
|
* See also ::jd and ::civil.
|
2553
2567
|
*/
|
@@ -2559,6 +2573,9 @@ date_s_valid_civil_p(int argc, VALUE *argv, VALUE klass)
|
|
2559
2573
|
|
2560
2574
|
rb_scan_args(argc, argv, "31", &vy, &vm, &vd, &vsg);
|
2561
2575
|
|
2576
|
+
RETURN_FALSE_UNLESS_NUMERIC(vy);
|
2577
|
+
RETURN_FALSE_UNLESS_NUMERIC(vm);
|
2578
|
+
RETURN_FALSE_UNLESS_NUMERIC(vd);
|
2562
2579
|
argv2[0] = vy;
|
2563
2580
|
argv2[1] = vm;
|
2564
2581
|
argv2[2] = vd;
|
@@ -2640,6 +2657,8 @@ date_s_valid_ordinal_p(int argc, VALUE *argv, VALUE klass)
|
|
2640
2657
|
|
2641
2658
|
rb_scan_args(argc, argv, "21", &vy, &vd, &vsg);
|
2642
2659
|
|
2660
|
+
RETURN_FALSE_UNLESS_NUMERIC(vy);
|
2661
|
+
RETURN_FALSE_UNLESS_NUMERIC(vd);
|
2643
2662
|
argv2[0] = vy;
|
2644
2663
|
argv2[1] = vd;
|
2645
2664
|
if (argc < 3)
|
@@ -2722,6 +2741,9 @@ date_s_valid_commercial_p(int argc, VALUE *argv, VALUE klass)
|
|
2722
2741
|
|
2723
2742
|
rb_scan_args(argc, argv, "31", &vy, &vw, &vd, &vsg);
|
2724
2743
|
|
2744
|
+
RETURN_FALSE_UNLESS_NUMERIC(vy);
|
2745
|
+
RETURN_FALSE_UNLESS_NUMERIC(vw);
|
2746
|
+
RETURN_FALSE_UNLESS_NUMERIC(vd);
|
2725
2747
|
argv2[0] = vy;
|
2726
2748
|
argv2[1] = vw;
|
2727
2749
|
argv2[2] = vd;
|
@@ -2903,6 +2925,7 @@ date_s_julian_leap_p(VALUE klass, VALUE y)
|
|
2903
2925
|
VALUE nth;
|
2904
2926
|
int ry;
|
2905
2927
|
|
2928
|
+
check_numeric(y, "year");
|
2906
2929
|
decode_year(y, +1, &nth, &ry);
|
2907
2930
|
return f_boolcast(c_julian_leap_p(ry));
|
2908
2931
|
}
|
@@ -2924,6 +2947,7 @@ date_s_gregorian_leap_p(VALUE klass, VALUE y)
|
|
2924
2947
|
VALUE nth;
|
2925
2948
|
int ry;
|
2926
2949
|
|
2950
|
+
check_numeric(y, "year");
|
2927
2951
|
decode_year(y, -1, &nth, &ry);
|
2928
2952
|
return f_boolcast(c_gregorian_leap_p(ry));
|
2929
2953
|
}
|
@@ -3047,7 +3071,7 @@ old_to_new(VALUE ajd, VALUE of, VALUE sg,
|
|
3047
3071
|
*rsg = NUM2DBL(sg);
|
3048
3072
|
|
3049
3073
|
if (*rdf < 0 || *rdf >= DAY_IN_SECONDS)
|
3050
|
-
rb_raise(
|
3074
|
+
rb_raise(eDateError, "invalid day fraction");
|
3051
3075
|
|
3052
3076
|
if (f_lt_p(*rsf, INT2FIX(0)) ||
|
3053
3077
|
f_ge_p(*rsf, INT2FIX(SECOND_IN_NANOSECONDS)))
|
@@ -3209,7 +3233,7 @@ do {\
|
|
3209
3233
|
s = s##_trunc(v##s, &fr);\
|
3210
3234
|
if (f_nonzero_p(fr)) {\
|
3211
3235
|
if (argc > n)\
|
3212
|
-
rb_raise(
|
3236
|
+
rb_raise(eDateError, "invalid fraction");\
|
3213
3237
|
fr2 = fr;\
|
3214
3238
|
}\
|
3215
3239
|
} while (0)
|
@@ -3219,7 +3243,7 @@ do {\
|
|
3219
3243
|
s = NUM2INT(s##_trunc(v##s, &fr));\
|
3220
3244
|
if (f_nonzero_p(fr)) {\
|
3221
3245
|
if (argc > n)\
|
3222
|
-
rb_raise(
|
3246
|
+
rb_raise(eDateError, "invalid fraction");\
|
3223
3247
|
fr2 = fr;\
|
3224
3248
|
}\
|
3225
3249
|
} while (0)
|
@@ -3278,6 +3302,7 @@ date_s_jd(int argc, VALUE *argv, VALUE klass)
|
|
3278
3302
|
case 2:
|
3279
3303
|
val2sg(vsg, sg);
|
3280
3304
|
case 1:
|
3305
|
+
check_numeric(vjd, "jd");
|
3281
3306
|
num2num_with_frac(jd, positive_inf);
|
3282
3307
|
}
|
3283
3308
|
|
@@ -3330,8 +3355,10 @@ date_s_ordinal(int argc, VALUE *argv, VALUE klass)
|
|
3330
3355
|
case 3:
|
3331
3356
|
val2sg(vsg, sg);
|
3332
3357
|
case 2:
|
3358
|
+
check_numeric(vd, "yday");
|
3333
3359
|
num2int_with_frac(d, positive_inf);
|
3334
3360
|
case 1:
|
3361
|
+
check_numeric(vy, "year");
|
3335
3362
|
y = vy;
|
3336
3363
|
}
|
3337
3364
|
|
@@ -3343,7 +3370,7 @@ date_s_ordinal(int argc, VALUE *argv, VALUE klass)
|
|
3343
3370
|
&nth, &ry,
|
3344
3371
|
&rd, &rjd,
|
3345
3372
|
&ns))
|
3346
|
-
rb_raise(
|
3373
|
+
rb_raise(eDateError, "invalid date");
|
3347
3374
|
|
3348
3375
|
ret = d_simple_new_internal(klass,
|
3349
3376
|
nth, rjd,
|
@@ -3410,10 +3437,13 @@ date_initialize(int argc, VALUE *argv, VALUE self)
|
|
3410
3437
|
case 4:
|
3411
3438
|
val2sg(vsg, sg);
|
3412
3439
|
case 3:
|
3440
|
+
check_numeric(vd, "day");
|
3413
3441
|
num2int_with_frac(d, positive_inf);
|
3414
3442
|
case 2:
|
3443
|
+
check_numeric(vm, "month");
|
3415
3444
|
m = NUM2INT(vm);
|
3416
3445
|
case 1:
|
3446
|
+
check_numeric(vy, "year");
|
3417
3447
|
y = vy;
|
3418
3448
|
}
|
3419
3449
|
|
@@ -3424,7 +3454,7 @@ date_initialize(int argc, VALUE *argv, VALUE self)
|
|
3424
3454
|
if (!valid_gregorian_p(y, m, d,
|
3425
3455
|
&nth, &ry,
|
3426
3456
|
&rm, &rd))
|
3427
|
-
rb_raise(
|
3457
|
+
rb_raise(eDateError, "invalid date");
|
3428
3458
|
|
3429
3459
|
set_to_simple(self, dat, nth, 0, sg, ry, rm, rd, HAVE_CIVIL);
|
3430
3460
|
}
|
@@ -3436,7 +3466,7 @@ date_initialize(int argc, VALUE *argv, VALUE self)
|
|
3436
3466
|
&nth, &ry,
|
3437
3467
|
&rm, &rd, &rjd,
|
3438
3468
|
&ns))
|
3439
|
-
rb_raise(
|
3469
|
+
rb_raise(eDateError, "invalid date");
|
3440
3470
|
|
3441
3471
|
set_to_simple(self, dat, nth, rjd, sg, ry, rm, rd, HAVE_JD | HAVE_CIVIL);
|
3442
3472
|
}
|
@@ -3480,10 +3510,13 @@ date_s_commercial(int argc, VALUE *argv, VALUE klass)
|
|
3480
3510
|
case 4:
|
3481
3511
|
val2sg(vsg, sg);
|
3482
3512
|
case 3:
|
3513
|
+
check_numeric(vd, "cwday");
|
3483
3514
|
num2int_with_frac(d, positive_inf);
|
3484
3515
|
case 2:
|
3516
|
+
check_numeric(vw, "cweek");
|
3485
3517
|
w = NUM2INT(vw);
|
3486
3518
|
case 1:
|
3519
|
+
check_numeric(vy, "year");
|
3487
3520
|
y = vy;
|
3488
3521
|
}
|
3489
3522
|
|
@@ -3495,7 +3528,7 @@ date_s_commercial(int argc, VALUE *argv, VALUE klass)
|
|
3495
3528
|
&nth, &ry,
|
3496
3529
|
&rw, &rd, &rjd,
|
3497
3530
|
&ns))
|
3498
|
-
rb_raise(
|
3531
|
+
rb_raise(eDateError, "invalid date");
|
3499
3532
|
|
3500
3533
|
ret = d_simple_new_internal(klass,
|
3501
3534
|
nth, rjd,
|
@@ -3545,7 +3578,7 @@ date_s_weeknum(int argc, VALUE *argv, VALUE klass)
|
|
3545
3578
|
&nth, &ry,
|
3546
3579
|
&rw, &rd, &rjd,
|
3547
3580
|
&ns))
|
3548
|
-
rb_raise(
|
3581
|
+
rb_raise(eDateError, "invalid date");
|
3549
3582
|
|
3550
3583
|
ret = d_simple_new_internal(klass,
|
3551
3584
|
nth, rjd,
|
@@ -3594,7 +3627,7 @@ date_s_nth_kday(int argc, VALUE *argv, VALUE klass)
|
|
3594
3627
|
&nth, &ry,
|
3595
3628
|
&rm, &rn, &rk, &rjd,
|
3596
3629
|
&ns))
|
3597
|
-
rb_raise(
|
3630
|
+
rb_raise(eDateError, "invalid date");
|
3598
3631
|
|
3599
3632
|
ret = d_simple_new_internal(klass,
|
3600
3633
|
nth, rjd,
|
@@ -3692,7 +3725,7 @@ rt_rewrite_frags(VALUE hash)
|
|
3692
3725
|
{
|
3693
3726
|
VALUE seconds;
|
3694
3727
|
|
3695
|
-
seconds =
|
3728
|
+
seconds = del_hash("seconds");
|
3696
3729
|
if (!NIL_P(seconds)) {
|
3697
3730
|
VALUE offset, d, h, min, s, fr;
|
3698
3731
|
|
@@ -3717,7 +3750,6 @@ rt_rewrite_frags(VALUE hash)
|
|
3717
3750
|
set_hash("min", min);
|
3718
3751
|
set_hash("sec", s);
|
3719
3752
|
set_hash("sec_fraction", fr);
|
3720
|
-
del_hash("seconds");
|
3721
3753
|
}
|
3722
3754
|
return hash;
|
3723
3755
|
}
|
@@ -4142,7 +4174,7 @@ d_new_by_frags(VALUE klass, VALUE hash, VALUE sg)
|
|
4142
4174
|
}
|
4143
4175
|
|
4144
4176
|
if (NIL_P(hash))
|
4145
|
-
rb_raise(
|
4177
|
+
rb_raise(eDateError, "invalid date");
|
4146
4178
|
|
4147
4179
|
if (NIL_P(ref_hash("jd")) &&
|
4148
4180
|
NIL_P(ref_hash("yday")) &&
|
@@ -4159,7 +4191,7 @@ d_new_by_frags(VALUE klass, VALUE hash, VALUE sg)
|
|
4159
4191
|
}
|
4160
4192
|
|
4161
4193
|
if (NIL_P(jd))
|
4162
|
-
rb_raise(
|
4194
|
+
rb_raise(eDateError, "invalid date");
|
4163
4195
|
{
|
4164
4196
|
VALUE nth;
|
4165
4197
|
int rjd;
|
@@ -4214,12 +4246,10 @@ date_s__strptime_internal(int argc, VALUE *argv, VALUE klass,
|
|
4214
4246
|
|
4215
4247
|
if (!NIL_P(zone)) {
|
4216
4248
|
rb_enc_copy(zone, vstr);
|
4217
|
-
OBJ_INFECT(zone, vstr);
|
4218
4249
|
set_hash("zone", zone);
|
4219
4250
|
}
|
4220
4251
|
if (!NIL_P(left)) {
|
4221
4252
|
rb_enc_copy(left, vstr);
|
4222
|
-
OBJ_INFECT(left, vstr);
|
4223
4253
|
set_hash("leftover", left);
|
4224
4254
|
}
|
4225
4255
|
}
|
@@ -4292,12 +4322,37 @@ date_s_strptime(int argc, VALUE *argv, VALUE klass)
|
|
4292
4322
|
|
4293
4323
|
VALUE date__parse(VALUE str, VALUE comp);
|
4294
4324
|
|
4325
|
+
static size_t
|
4326
|
+
get_limit(VALUE opt)
|
4327
|
+
{
|
4328
|
+
if (!NIL_P(opt)) {
|
4329
|
+
VALUE limit = rb_hash_aref(opt, ID2SYM(rb_intern("limit")));
|
4330
|
+
if (NIL_P(limit)) return SIZE_MAX;
|
4331
|
+
return NUM2SIZET(limit);
|
4332
|
+
}
|
4333
|
+
return 128;
|
4334
|
+
}
|
4335
|
+
|
4336
|
+
static void
|
4337
|
+
check_limit(VALUE str, VALUE opt)
|
4338
|
+
{
|
4339
|
+
StringValue(str);
|
4340
|
+
size_t slen = RSTRING_LEN(str);
|
4341
|
+
size_t limit = get_limit(opt);
|
4342
|
+
if (slen > limit) {
|
4343
|
+
rb_raise(rb_eArgError,
|
4344
|
+
"string length (%"PRI_SIZE_PREFIX"u) exceeds the limit %"PRI_SIZE_PREFIX"u", slen, limit);
|
4345
|
+
}
|
4346
|
+
}
|
4347
|
+
|
4295
4348
|
static VALUE
|
4296
4349
|
date_s__parse_internal(int argc, VALUE *argv, VALUE klass)
|
4297
4350
|
{
|
4298
|
-
VALUE vstr, vcomp, hash;
|
4351
|
+
VALUE vstr, vcomp, hash, opt;
|
4299
4352
|
|
4300
|
-
rb_scan_args(argc, argv, "11", &vstr, &vcomp);
|
4353
|
+
rb_scan_args(argc, argv, "11:", &vstr, &vcomp, &opt);
|
4354
|
+
if (!NIL_P(opt)) argc--;
|
4355
|
+
check_limit(vstr, opt);
|
4301
4356
|
StringValue(vstr);
|
4302
4357
|
if (!rb_enc_str_asciicompat_p(vstr))
|
4303
4358
|
rb_raise(rb_eArgError,
|
@@ -4307,22 +4362,12 @@ date_s__parse_internal(int argc, VALUE *argv, VALUE klass)
|
|
4307
4362
|
|
4308
4363
|
hash = date__parse(vstr, vcomp);
|
4309
4364
|
|
4310
|
-
{
|
4311
|
-
VALUE zone = ref_hash("zone");
|
4312
|
-
|
4313
|
-
if (!NIL_P(zone)) {
|
4314
|
-
rb_enc_copy(zone, vstr);
|
4315
|
-
OBJ_INFECT(zone, vstr);
|
4316
|
-
set_hash("zone", zone);
|
4317
|
-
}
|
4318
|
-
}
|
4319
|
-
|
4320
4365
|
return hash;
|
4321
4366
|
}
|
4322
4367
|
|
4323
4368
|
/*
|
4324
4369
|
* call-seq:
|
4325
|
-
* Date._parse(string[, comp=true]) -> hash
|
4370
|
+
* Date._parse(string[, comp=true], limit: 128) -> hash
|
4326
4371
|
*
|
4327
4372
|
* Parses the given representation of date and time, and returns a
|
4328
4373
|
* hash of parsed elements. This method does not function as a
|
@@ -4333,6 +4378,10 @@ date_s__parse_internal(int argc, VALUE *argv, VALUE klass)
|
|
4333
4378
|
* it full.
|
4334
4379
|
*
|
4335
4380
|
* Date._parse('2001-02-03') #=> {:year=>2001, :mon=>2, :mday=>3}
|
4381
|
+
*
|
4382
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4383
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4384
|
+
* it may take a long time to parse.
|
4336
4385
|
*/
|
4337
4386
|
static VALUE
|
4338
4387
|
date_s__parse(int argc, VALUE *argv, VALUE klass)
|
@@ -4342,7 +4391,7 @@ date_s__parse(int argc, VALUE *argv, VALUE klass)
|
|
4342
4391
|
|
4343
4392
|
/*
|
4344
4393
|
* call-seq:
|
4345
|
-
* Date.parse(string='-4712-01-01'[, comp=true[, start=Date::ITALY]]) -> date
|
4394
|
+
* Date.parse(string='-4712-01-01'[, comp=true[, start=Date::ITALY]], limit: 128) -> date
|
4346
4395
|
*
|
4347
4396
|
* Parses the given representation of date and time, and creates a
|
4348
4397
|
* date object. This method does not function as a validator.
|
@@ -4354,13 +4403,18 @@ date_s__parse(int argc, VALUE *argv, VALUE klass)
|
|
4354
4403
|
* Date.parse('2001-02-03') #=> #<Date: 2001-02-03 ...>
|
4355
4404
|
* Date.parse('20010203') #=> #<Date: 2001-02-03 ...>
|
4356
4405
|
* Date.parse('3rd Feb 2001') #=> #<Date: 2001-02-03 ...>
|
4406
|
+
*
|
4407
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4408
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4409
|
+
* it may take a long time to parse.
|
4357
4410
|
*/
|
4358
4411
|
static VALUE
|
4359
4412
|
date_s_parse(int argc, VALUE *argv, VALUE klass)
|
4360
4413
|
{
|
4361
|
-
VALUE str, comp, sg;
|
4414
|
+
VALUE str, comp, sg, opt;
|
4362
4415
|
|
4363
|
-
rb_scan_args(argc, argv, "03", &str, &comp, &sg);
|
4416
|
+
rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt);
|
4417
|
+
if (!NIL_P(opt)) argc--;
|
4364
4418
|
|
4365
4419
|
switch (argc) {
|
4366
4420
|
case 0:
|
@@ -4372,11 +4426,12 @@ date_s_parse(int argc, VALUE *argv, VALUE klass)
|
|
4372
4426
|
}
|
4373
4427
|
|
4374
4428
|
{
|
4375
|
-
|
4376
|
-
|
4377
|
-
|
4378
|
-
|
4379
|
-
|
4429
|
+
int argc2 = 2;
|
4430
|
+
VALUE argv2[3];
|
4431
|
+
argv2[0] = str;
|
4432
|
+
argv2[1] = comp;
|
4433
|
+
if (!NIL_P(opt)) argv2[argc2++] = opt;
|
4434
|
+
VALUE hash = date_s__parse(argc2, argv2, klass);
|
4380
4435
|
return d_new_by_frags(klass, hash, sg);
|
4381
4436
|
}
|
4382
4437
|
}
|
@@ -4390,19 +4445,28 @@ VALUE date__jisx0301(VALUE);
|
|
4390
4445
|
|
4391
4446
|
/*
|
4392
4447
|
* call-seq:
|
4393
|
-
* Date._iso8601(string) -> hash
|
4448
|
+
* Date._iso8601(string, limit: 128) -> hash
|
4394
4449
|
*
|
4395
4450
|
* Returns a hash of parsed elements.
|
4451
|
+
*
|
4452
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4453
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4454
|
+
* it may take a long time to parse.
|
4396
4455
|
*/
|
4397
4456
|
static VALUE
|
4398
|
-
date_s__iso8601(VALUE
|
4457
|
+
date_s__iso8601(int argc, VALUE *argv, VALUE klass)
|
4399
4458
|
{
|
4459
|
+
VALUE str, opt;
|
4460
|
+
|
4461
|
+
rb_scan_args(argc, argv, "1:", &str, &opt);
|
4462
|
+
check_limit(str, opt);
|
4463
|
+
|
4400
4464
|
return date__iso8601(str);
|
4401
4465
|
}
|
4402
4466
|
|
4403
4467
|
/*
|
4404
4468
|
* call-seq:
|
4405
|
-
* Date.iso8601(string='-4712-01-01'[, start=Date::ITALY]) -> date
|
4469
|
+
* Date.iso8601(string='-4712-01-01'[, start=Date::ITALY], limit: 128) -> date
|
4406
4470
|
*
|
4407
4471
|
* Creates a new Date object by parsing from a string according to
|
4408
4472
|
* some typical ISO 8601 formats.
|
@@ -4410,13 +4474,18 @@ date_s__iso8601(VALUE klass, VALUE str)
|
|
4410
4474
|
* Date.iso8601('2001-02-03') #=> #<Date: 2001-02-03 ...>
|
4411
4475
|
* Date.iso8601('20010203') #=> #<Date: 2001-02-03 ...>
|
4412
4476
|
* Date.iso8601('2001-W05-6') #=> #<Date: 2001-02-03 ...>
|
4477
|
+
*
|
4478
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4479
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4480
|
+
* it may take a long time to parse.
|
4413
4481
|
*/
|
4414
4482
|
static VALUE
|
4415
4483
|
date_s_iso8601(int argc, VALUE *argv, VALUE klass)
|
4416
4484
|
{
|
4417
|
-
VALUE str, sg;
|
4485
|
+
VALUE str, sg, opt;
|
4418
4486
|
|
4419
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
4487
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
4488
|
+
if (!NIL_P(opt)) argc--;
|
4420
4489
|
|
4421
4490
|
switch (argc) {
|
4422
4491
|
case 0:
|
@@ -4426,38 +4495,56 @@ date_s_iso8601(int argc, VALUE *argv, VALUE klass)
|
|
4426
4495
|
}
|
4427
4496
|
|
4428
4497
|
{
|
4429
|
-
|
4498
|
+
int argc2 = 1;
|
4499
|
+
VALUE argv2[2];
|
4500
|
+
argv2[0] = str;
|
4501
|
+
if (!NIL_P(opt)) argv2[argc2++] = opt;
|
4502
|
+
VALUE hash = date_s__iso8601(argc2, argv2, klass);
|
4430
4503
|
return d_new_by_frags(klass, hash, sg);
|
4431
4504
|
}
|
4432
4505
|
}
|
4433
4506
|
|
4434
4507
|
/*
|
4435
4508
|
* call-seq:
|
4436
|
-
* Date._rfc3339(string) -> hash
|
4509
|
+
* Date._rfc3339(string, limit: 128) -> hash
|
4437
4510
|
*
|
4438
4511
|
* Returns a hash of parsed elements.
|
4512
|
+
*
|
4513
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4514
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4515
|
+
* it may take a long time to parse.
|
4439
4516
|
*/
|
4440
4517
|
static VALUE
|
4441
|
-
date_s__rfc3339(VALUE
|
4518
|
+
date_s__rfc3339(int argc, VALUE *argv, VALUE klass)
|
4442
4519
|
{
|
4520
|
+
VALUE str, opt;
|
4521
|
+
|
4522
|
+
rb_scan_args(argc, argv, "1:", &str, &opt);
|
4523
|
+
check_limit(str, opt);
|
4524
|
+
|
4443
4525
|
return date__rfc3339(str);
|
4444
4526
|
}
|
4445
4527
|
|
4446
4528
|
/*
|
4447
4529
|
* call-seq:
|
4448
|
-
* Date.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> date
|
4530
|
+
* Date.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> date
|
4449
4531
|
*
|
4450
4532
|
* Creates a new Date object by parsing from a string according to
|
4451
4533
|
* some typical RFC 3339 formats.
|
4452
4534
|
*
|
4453
4535
|
* Date.rfc3339('2001-02-03T04:05:06+07:00') #=> #<Date: 2001-02-03 ...>
|
4536
|
+
*
|
4537
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4538
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4539
|
+
* it may take a long time to parse.
|
4454
4540
|
*/
|
4455
4541
|
static VALUE
|
4456
4542
|
date_s_rfc3339(int argc, VALUE *argv, VALUE klass)
|
4457
4543
|
{
|
4458
|
-
VALUE str, sg;
|
4544
|
+
VALUE str, sg, opt;
|
4459
4545
|
|
4460
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
4546
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
4547
|
+
if (!NIL_P(opt)) argc--;
|
4461
4548
|
|
4462
4549
|
switch (argc) {
|
4463
4550
|
case 0:
|
@@ -4467,38 +4554,56 @@ date_s_rfc3339(int argc, VALUE *argv, VALUE klass)
|
|
4467
4554
|
}
|
4468
4555
|
|
4469
4556
|
{
|
4470
|
-
|
4557
|
+
int argc2 = 1;
|
4558
|
+
VALUE argv2[2];
|
4559
|
+
argv2[0] = str;
|
4560
|
+
if (!NIL_P(opt)) argv2[argc2++] = opt;
|
4561
|
+
VALUE hash = date_s__rfc3339(argc2, argv2, klass);
|
4471
4562
|
return d_new_by_frags(klass, hash, sg);
|
4472
4563
|
}
|
4473
4564
|
}
|
4474
4565
|
|
4475
4566
|
/*
|
4476
4567
|
* call-seq:
|
4477
|
-
* Date._xmlschema(string) -> hash
|
4568
|
+
* Date._xmlschema(string, limit: 128) -> hash
|
4478
4569
|
*
|
4479
4570
|
* Returns a hash of parsed elements.
|
4571
|
+
*
|
4572
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4573
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4574
|
+
* it may take a long time to parse.
|
4480
4575
|
*/
|
4481
4576
|
static VALUE
|
4482
|
-
date_s__xmlschema(VALUE
|
4577
|
+
date_s__xmlschema(int argc, VALUE *argv, VALUE klass)
|
4483
4578
|
{
|
4579
|
+
VALUE str, opt;
|
4580
|
+
|
4581
|
+
rb_scan_args(argc, argv, "1:", &str, &opt);
|
4582
|
+
check_limit(str, opt);
|
4583
|
+
|
4484
4584
|
return date__xmlschema(str);
|
4485
4585
|
}
|
4486
4586
|
|
4487
4587
|
/*
|
4488
4588
|
* call-seq:
|
4489
|
-
* Date.xmlschema(string='-4712-01-01'[, start=Date::ITALY]) -> date
|
4589
|
+
* Date.xmlschema(string='-4712-01-01'[, start=Date::ITALY], limit: 128) -> date
|
4490
4590
|
*
|
4491
4591
|
* Creates a new Date object by parsing from a string according to
|
4492
4592
|
* some typical XML Schema formats.
|
4493
4593
|
*
|
4494
4594
|
* Date.xmlschema('2001-02-03') #=> #<Date: 2001-02-03 ...>
|
4595
|
+
*
|
4596
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4597
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4598
|
+
* it may take a long time to parse.
|
4495
4599
|
*/
|
4496
4600
|
static VALUE
|
4497
4601
|
date_s_xmlschema(int argc, VALUE *argv, VALUE klass)
|
4498
4602
|
{
|
4499
|
-
VALUE str, sg;
|
4603
|
+
VALUE str, sg, opt;
|
4500
4604
|
|
4501
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
4605
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
4606
|
+
if (!NIL_P(opt)) argc--;
|
4502
4607
|
|
4503
4608
|
switch (argc) {
|
4504
4609
|
case 0:
|
@@ -4508,41 +4613,58 @@ date_s_xmlschema(int argc, VALUE *argv, VALUE klass)
|
|
4508
4613
|
}
|
4509
4614
|
|
4510
4615
|
{
|
4511
|
-
|
4616
|
+
int argc2 = 1;
|
4617
|
+
VALUE argv2[2];
|
4618
|
+
argv2[0] = str;
|
4619
|
+
if (!NIL_P(opt)) argv2[argc2++] = opt;
|
4620
|
+
VALUE hash = date_s__xmlschema(argc2, argv2, klass);
|
4512
4621
|
return d_new_by_frags(klass, hash, sg);
|
4513
4622
|
}
|
4514
4623
|
}
|
4515
4624
|
|
4516
4625
|
/*
|
4517
4626
|
* call-seq:
|
4518
|
-
* Date._rfc2822(string) -> hash
|
4519
|
-
* Date._rfc822(string) -> hash
|
4627
|
+
* Date._rfc2822(string, limit: 128) -> hash
|
4628
|
+
* Date._rfc822(string, limit: 128) -> hash
|
4520
4629
|
*
|
4521
4630
|
* Returns a hash of parsed elements.
|
4631
|
+
*
|
4632
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4633
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4634
|
+
* it may take a long time to parse.
|
4522
4635
|
*/
|
4523
4636
|
static VALUE
|
4524
|
-
date_s__rfc2822(VALUE
|
4637
|
+
date_s__rfc2822(int argc, VALUE *argv, VALUE klass)
|
4525
4638
|
{
|
4639
|
+
VALUE str, opt;
|
4640
|
+
|
4641
|
+
rb_scan_args(argc, argv, "1:", &str, &opt);
|
4642
|
+
check_limit(str, opt);
|
4643
|
+
|
4526
4644
|
return date__rfc2822(str);
|
4527
4645
|
}
|
4528
4646
|
|
4529
4647
|
/*
|
4530
4648
|
* call-seq:
|
4531
|
-
* Date.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> date
|
4532
|
-
* Date.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> date
|
4649
|
+
* Date.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> date
|
4650
|
+
* Date.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> date
|
4533
4651
|
*
|
4534
4652
|
* Creates a new Date object by parsing from a string according to
|
4535
4653
|
* some typical RFC 2822 formats.
|
4536
4654
|
*
|
4537
4655
|
* Date.rfc2822('Sat, 3 Feb 2001 00:00:00 +0000')
|
4538
4656
|
* #=> #<Date: 2001-02-03 ...>
|
4657
|
+
*
|
4658
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4659
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4660
|
+
* it may take a long time to parse.
|
4539
4661
|
*/
|
4540
4662
|
static VALUE
|
4541
4663
|
date_s_rfc2822(int argc, VALUE *argv, VALUE klass)
|
4542
4664
|
{
|
4543
|
-
VALUE str, sg;
|
4665
|
+
VALUE str, sg, opt;
|
4544
4666
|
|
4545
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
4667
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
4546
4668
|
|
4547
4669
|
switch (argc) {
|
4548
4670
|
case 0:
|
@@ -4552,39 +4674,56 @@ date_s_rfc2822(int argc, VALUE *argv, VALUE klass)
|
|
4552
4674
|
}
|
4553
4675
|
|
4554
4676
|
{
|
4555
|
-
|
4677
|
+
int argc2 = 1;
|
4678
|
+
VALUE argv2[2];
|
4679
|
+
argv2[0] = str;
|
4680
|
+
if (!NIL_P(opt)) argv2[argc2++] = opt;
|
4681
|
+
VALUE hash = date_s__rfc2822(argc2, argv2, klass);
|
4556
4682
|
return d_new_by_frags(klass, hash, sg);
|
4557
4683
|
}
|
4558
4684
|
}
|
4559
4685
|
|
4560
4686
|
/*
|
4561
4687
|
* call-seq:
|
4562
|
-
* Date._httpdate(string) -> hash
|
4688
|
+
* Date._httpdate(string, limit: 128) -> hash
|
4563
4689
|
*
|
4564
4690
|
* Returns a hash of parsed elements.
|
4691
|
+
*
|
4692
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4693
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4694
|
+
* it may take a long time to parse.
|
4565
4695
|
*/
|
4566
4696
|
static VALUE
|
4567
|
-
date_s__httpdate(VALUE
|
4697
|
+
date_s__httpdate(int argc, VALUE *argv, VALUE klass)
|
4568
4698
|
{
|
4699
|
+
VALUE str, opt;
|
4700
|
+
|
4701
|
+
rb_scan_args(argc, argv, "1:", &str, &opt);
|
4702
|
+
check_limit(str, opt);
|
4703
|
+
|
4569
4704
|
return date__httpdate(str);
|
4570
4705
|
}
|
4571
4706
|
|
4572
4707
|
/*
|
4573
4708
|
* call-seq:
|
4574
|
-
* Date.httpdate(string='Mon, 01 Jan -4712 00:00:00 GMT'[, start=Date::ITALY]) -> date
|
4709
|
+
* Date.httpdate(string='Mon, 01 Jan -4712 00:00:00 GMT'[, start=Date::ITALY], limit: 128) -> date
|
4575
4710
|
*
|
4576
4711
|
* Creates a new Date object by parsing from a string according to
|
4577
4712
|
* some RFC 2616 format.
|
4578
4713
|
*
|
4579
4714
|
* Date.httpdate('Sat, 03 Feb 2001 00:00:00 GMT')
|
4580
4715
|
* #=> #<Date: 2001-02-03 ...>
|
4716
|
+
*
|
4717
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4718
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4719
|
+
* it may take a long time to parse.
|
4581
4720
|
*/
|
4582
4721
|
static VALUE
|
4583
4722
|
date_s_httpdate(int argc, VALUE *argv, VALUE klass)
|
4584
4723
|
{
|
4585
|
-
VALUE str, sg;
|
4724
|
+
VALUE str, sg, opt;
|
4586
4725
|
|
4587
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
4726
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
4588
4727
|
|
4589
4728
|
switch (argc) {
|
4590
4729
|
case 0:
|
@@ -4594,38 +4733,60 @@ date_s_httpdate(int argc, VALUE *argv, VALUE klass)
|
|
4594
4733
|
}
|
4595
4734
|
|
4596
4735
|
{
|
4597
|
-
|
4736
|
+
int argc2 = 1;
|
4737
|
+
VALUE argv2[2];
|
4738
|
+
argv2[0] = str;
|
4739
|
+
if (!NIL_P(opt)) argv2[argc2++] = opt;
|
4740
|
+
VALUE hash = date_s__httpdate(argc2, argv2, klass);
|
4598
4741
|
return d_new_by_frags(klass, hash, sg);
|
4599
4742
|
}
|
4600
4743
|
}
|
4601
4744
|
|
4602
4745
|
/*
|
4603
4746
|
* call-seq:
|
4604
|
-
* Date._jisx0301(string) -> hash
|
4747
|
+
* Date._jisx0301(string, limit: 128) -> hash
|
4605
4748
|
*
|
4606
4749
|
* Returns a hash of parsed elements.
|
4750
|
+
*
|
4751
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4752
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4753
|
+
* it may take a long time to parse.
|
4607
4754
|
*/
|
4608
4755
|
static VALUE
|
4609
|
-
date_s__jisx0301(VALUE
|
4756
|
+
date_s__jisx0301(int argc, VALUE *argv, VALUE klass)
|
4610
4757
|
{
|
4758
|
+
VALUE str, opt;
|
4759
|
+
|
4760
|
+
rb_scan_args(argc, argv, "1:", &str, &opt);
|
4761
|
+
check_limit(str, opt);
|
4762
|
+
|
4611
4763
|
return date__jisx0301(str);
|
4612
4764
|
}
|
4613
4765
|
|
4614
4766
|
/*
|
4615
4767
|
* call-seq:
|
4616
|
-
* Date.jisx0301(string='-4712-01-01'[, start=Date::ITALY]) -> date
|
4768
|
+
* Date.jisx0301(string='-4712-01-01'[, start=Date::ITALY], limit: 128) -> date
|
4617
4769
|
*
|
4618
4770
|
* Creates a new Date object by parsing from a string according to
|
4619
4771
|
* some typical JIS X 0301 formats.
|
4620
4772
|
*
|
4621
4773
|
* Date.jisx0301('H13.02.03') #=> #<Date: 2001-02-03 ...>
|
4774
|
+
*
|
4775
|
+
* For no-era year, legacy format, Heisei is assumed.
|
4776
|
+
*
|
4777
|
+
* Date.jisx0301('13.02.03') #=> #<Date: 2001-02-03 ...>
|
4778
|
+
*
|
4779
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
4780
|
+
* You can stop this check by passing `limit: nil`, but note that
|
4781
|
+
* it may take a long time to parse.
|
4622
4782
|
*/
|
4623
4783
|
static VALUE
|
4624
4784
|
date_s_jisx0301(int argc, VALUE *argv, VALUE klass)
|
4625
4785
|
{
|
4626
|
-
VALUE str, sg;
|
4786
|
+
VALUE str, sg, opt;
|
4627
4787
|
|
4628
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
4788
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
4789
|
+
if (!NIL_P(opt)) argc--;
|
4629
4790
|
|
4630
4791
|
switch (argc) {
|
4631
4792
|
case 0:
|
@@ -4635,7 +4796,11 @@ date_s_jisx0301(int argc, VALUE *argv, VALUE klass)
|
|
4635
4796
|
}
|
4636
4797
|
|
4637
4798
|
{
|
4638
|
-
|
4799
|
+
int argc2 = 1;
|
4800
|
+
VALUE argv2[2];
|
4801
|
+
argv2[0] = str;
|
4802
|
+
if (!NIL_P(opt)) argv2[argc2++] = opt;
|
4803
|
+
VALUE hash = date_s__jisx0301(argc2, argv2, klass);
|
4639
4804
|
return d_new_by_frags(klass, hash, sg);
|
4640
4805
|
}
|
4641
4806
|
}
|
@@ -4709,7 +4874,6 @@ d_lite_initialize(int argc, VALUE *argv, VALUE self)
|
|
4709
4874
|
double sg;
|
4710
4875
|
|
4711
4876
|
rb_check_frozen(self);
|
4712
|
-
rb_check_trusted(self);
|
4713
4877
|
|
4714
4878
|
rb_scan_args(argc, argv, "05", &vjd, &vdf, &vsf, &vof, &vsg);
|
4715
4879
|
|
@@ -4728,11 +4892,11 @@ d_lite_initialize(int argc, VALUE *argv, VALUE self)
|
|
4728
4892
|
sf = vsf;
|
4729
4893
|
if (f_lt_p(sf, INT2FIX(0)) ||
|
4730
4894
|
f_ge_p(sf, INT2FIX(SECOND_IN_NANOSECONDS)))
|
4731
|
-
rb_raise(
|
4895
|
+
rb_raise(eDateError, "invalid second fraction");
|
4732
4896
|
case 2:
|
4733
4897
|
df = NUM2INT(vdf);
|
4734
4898
|
if (df < 0 || df >= DAY_IN_SECONDS)
|
4735
|
-
rb_raise(
|
4899
|
+
rb_raise(eDateError, "invalid day fraction");
|
4736
4900
|
case 1:
|
4737
4901
|
jd = vjd;
|
4738
4902
|
}
|
@@ -4765,7 +4929,6 @@ static VALUE
|
|
4765
4929
|
d_lite_initialize_copy(VALUE copy, VALUE date)
|
4766
4930
|
{
|
4767
4931
|
rb_check_frozen(copy);
|
4768
|
-
rb_check_trusted(copy);
|
4769
4932
|
|
4770
4933
|
if (copy == date)
|
4771
4934
|
return copy;
|
@@ -6043,7 +6206,7 @@ d_lite_rshift(VALUE self, VALUE other)
|
|
6043
6206
|
&rm, &rd, &rjd, &ns))
|
6044
6207
|
break;
|
6045
6208
|
if (--d < 1)
|
6046
|
-
rb_raise(
|
6209
|
+
rb_raise(eDateError, "invalid date");
|
6047
6210
|
}
|
6048
6211
|
encode_jd(nth, rjd, &rjd2);
|
6049
6212
|
return d_lite_plus(self, f_sub(rjd2, m_real_local_jd(dat)));
|
@@ -6567,9 +6730,9 @@ mk_inspect(union DateData *x, VALUE klass, VALUE to_s)
|
|
6567
6730
|
* Returns the value as a string for inspection.
|
6568
6731
|
*
|
6569
6732
|
* Date.new(2001,2,3).inspect
|
6570
|
-
* #=> "#<Date: 2001-02-03
|
6733
|
+
* #=> "#<Date: 2001-02-03>"
|
6571
6734
|
* DateTime.new(2001,2,3,4,5,6,'-7').inspect
|
6572
|
-
* #=> "#<DateTime: 2001-02-03T04:05:06-07:00
|
6735
|
+
* #=> "#<DateTime: 2001-02-03T04:05:06-07:00>"
|
6573
6736
|
*/
|
6574
6737
|
static VALUE
|
6575
6738
|
d_lite_inspect(VALUE self)
|
@@ -6738,7 +6901,6 @@ date_strftime_internal(int argc, VALUE *argv, VALUE self,
|
|
6738
6901
|
if (p > fmt) rb_str_cat(str, fmt, p - fmt);
|
6739
6902
|
}
|
6740
6903
|
rb_enc_copy(str, vfmt);
|
6741
|
-
OBJ_INFECT(str, vfmt);
|
6742
6904
|
return str;
|
6743
6905
|
}
|
6744
6906
|
else
|
@@ -6747,7 +6909,6 @@ date_strftime_internal(int argc, VALUE *argv, VALUE self,
|
|
6747
6909
|
str = rb_str_new(buf, len);
|
6748
6910
|
if (buf != buffer) xfree(buf);
|
6749
6911
|
rb_enc_copy(str, vfmt);
|
6750
|
-
OBJ_INFECT(str, vfmt);
|
6751
6912
|
return str;
|
6752
6913
|
}
|
6753
6914
|
|
@@ -7046,10 +7207,14 @@ jisx0301_date_format(char *fmt, size_t size, VALUE jd, VALUE y)
|
|
7046
7207
|
c = 'S';
|
7047
7208
|
s = 1925;
|
7048
7209
|
}
|
7049
|
-
else {
|
7210
|
+
else if (d < 2458605) {
|
7050
7211
|
c = 'H';
|
7051
7212
|
s = 1988;
|
7052
7213
|
}
|
7214
|
+
else {
|
7215
|
+
c = 'R';
|
7216
|
+
s = 2018;
|
7217
|
+
}
|
7053
7218
|
snprintf(fmt, size, "%c%02ld" ".%%m.%%d", c, FIX2INT(y) - s);
|
7054
7219
|
return fmt;
|
7055
7220
|
}
|
@@ -7134,7 +7299,6 @@ d_lite_marshal_load(VALUE self, VALUE a)
|
|
7134
7299
|
get_d1(self);
|
7135
7300
|
|
7136
7301
|
rb_check_frozen(self);
|
7137
|
-
rb_check_trusted(self);
|
7138
7302
|
|
7139
7303
|
if (!RB_TYPE_P(a, T_ARRAY))
|
7140
7304
|
rb_raise(rb_eTypeError, "expected an array");
|
@@ -7179,11 +7343,14 @@ d_lite_marshal_load(VALUE self, VALUE a)
|
|
7179
7343
|
|
7180
7344
|
if (simple_dat_p(dat)) {
|
7181
7345
|
if (df || !f_zero_p(sf) || of) {
|
7182
|
-
|
7183
|
-
|
7346
|
+
/* loading a fractional date; promote to complex */
|
7347
|
+
dat = ruby_xrealloc(dat, sizeof(struct ComplexDateData));
|
7348
|
+
RTYPEDDATA(self)->data = dat;
|
7349
|
+
goto complex_data;
|
7184
7350
|
}
|
7185
7351
|
set_to_simple(self, &dat->s, nth, jd, sg, 0, 0, 0, HAVE_JD);
|
7186
7352
|
} else {
|
7353
|
+
complex_data:
|
7187
7354
|
set_to_complex(self, &dat->c, nth, jd, df, sf, of, sg,
|
7188
7355
|
0, 0, 0, 0, 0, 0,
|
7189
7356
|
HAVE_JD | HAVE_DF);
|
@@ -7244,12 +7411,16 @@ datetime_s_jd(int argc, VALUE *argv, VALUE klass)
|
|
7244
7411
|
case 5:
|
7245
7412
|
val2off(vof, rof);
|
7246
7413
|
case 4:
|
7414
|
+
check_numeric(vs, "second");
|
7247
7415
|
num2int_with_frac(s, positive_inf);
|
7248
7416
|
case 3:
|
7417
|
+
check_numeric(vmin, "minute");
|
7249
7418
|
num2int_with_frac(min, 3);
|
7250
7419
|
case 2:
|
7420
|
+
check_numeric(vh, "hour");
|
7251
7421
|
num2int_with_frac(h, 2);
|
7252
7422
|
case 1:
|
7423
|
+
check_numeric(vjd, "jd");
|
7253
7424
|
num2num_with_frac(jd, 1);
|
7254
7425
|
}
|
7255
7426
|
|
@@ -7258,7 +7429,7 @@ datetime_s_jd(int argc, VALUE *argv, VALUE klass)
|
|
7258
7429
|
int rh, rmin, rs, rjd, rjd2;
|
7259
7430
|
|
7260
7431
|
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
|
7261
|
-
rb_raise(
|
7432
|
+
rb_raise(eDateError, "invalid date");
|
7262
7433
|
canon24oc();
|
7263
7434
|
|
7264
7435
|
decode_jd(jd, &nth, &rjd);
|
@@ -7313,14 +7484,19 @@ datetime_s_ordinal(int argc, VALUE *argv, VALUE klass)
|
|
7313
7484
|
case 6:
|
7314
7485
|
val2off(vof, rof);
|
7315
7486
|
case 5:
|
7487
|
+
check_numeric(vs, "second");
|
7316
7488
|
num2int_with_frac(s, positive_inf);
|
7317
7489
|
case 4:
|
7490
|
+
check_numeric(vmin, "minute");
|
7318
7491
|
num2int_with_frac(min, 4);
|
7319
7492
|
case 3:
|
7493
|
+
check_numeric(vh, "hour");
|
7320
7494
|
num2int_with_frac(h, 3);
|
7321
7495
|
case 2:
|
7496
|
+
check_numeric(vd, "yday");
|
7322
7497
|
num2int_with_frac(d, 2);
|
7323
7498
|
case 1:
|
7499
|
+
check_numeric(vy, "year");
|
7324
7500
|
y = vy;
|
7325
7501
|
}
|
7326
7502
|
|
@@ -7332,9 +7508,9 @@ datetime_s_ordinal(int argc, VALUE *argv, VALUE klass)
|
|
7332
7508
|
&nth, &ry,
|
7333
7509
|
&rd, &rjd,
|
7334
7510
|
&ns))
|
7335
|
-
rb_raise(
|
7511
|
+
rb_raise(eDateError, "invalid date");
|
7336
7512
|
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
|
7337
|
-
rb_raise(
|
7513
|
+
rb_raise(eDateError, "invalid date");
|
7338
7514
|
canon24oc();
|
7339
7515
|
|
7340
7516
|
rjd2 = jd_local_to_utc(rjd,
|
@@ -7401,16 +7577,22 @@ datetime_initialize(int argc, VALUE *argv, VALUE self)
|
|
7401
7577
|
case 7:
|
7402
7578
|
val2off(vof, rof);
|
7403
7579
|
case 6:
|
7580
|
+
check_numeric(vs, "second");
|
7404
7581
|
num2int_with_frac(s, positive_inf);
|
7405
7582
|
case 5:
|
7583
|
+
check_numeric(vmin, "minute");
|
7406
7584
|
num2int_with_frac(min, 5);
|
7407
7585
|
case 4:
|
7586
|
+
check_numeric(vh, "hour");
|
7408
7587
|
num2int_with_frac(h, 4);
|
7409
7588
|
case 3:
|
7589
|
+
check_numeric(vd, "day");
|
7410
7590
|
num2int_with_frac(d, 3);
|
7411
7591
|
case 2:
|
7592
|
+
check_numeric(vm, "month");
|
7412
7593
|
m = NUM2INT(vm);
|
7413
7594
|
case 1:
|
7595
|
+
check_numeric(vy, "year");
|
7414
7596
|
y = vy;
|
7415
7597
|
}
|
7416
7598
|
|
@@ -7421,9 +7603,9 @@ datetime_initialize(int argc, VALUE *argv, VALUE self)
|
|
7421
7603
|
if (!valid_gregorian_p(y, m, d,
|
7422
7604
|
&nth, &ry,
|
7423
7605
|
&rm, &rd))
|
7424
|
-
rb_raise(
|
7606
|
+
rb_raise(eDateError, "invalid date");
|
7425
7607
|
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
|
7426
|
-
rb_raise(
|
7608
|
+
rb_raise(eDateError, "invalid date");
|
7427
7609
|
canon24oc();
|
7428
7610
|
|
7429
7611
|
set_to_complex(self, dat,
|
@@ -7442,9 +7624,9 @@ datetime_initialize(int argc, VALUE *argv, VALUE self)
|
|
7442
7624
|
&nth, &ry,
|
7443
7625
|
&rm, &rd, &rjd,
|
7444
7626
|
&ns))
|
7445
|
-
rb_raise(
|
7627
|
+
rb_raise(eDateError, "invalid date");
|
7446
7628
|
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
|
7447
|
-
rb_raise(
|
7629
|
+
rb_raise(eDateError, "invalid date");
|
7448
7630
|
canon24oc();
|
7449
7631
|
|
7450
7632
|
rjd2 = jd_local_to_utc(rjd,
|
@@ -7499,16 +7681,22 @@ datetime_s_commercial(int argc, VALUE *argv, VALUE klass)
|
|
7499
7681
|
case 7:
|
7500
7682
|
val2off(vof, rof);
|
7501
7683
|
case 6:
|
7684
|
+
check_numeric(vs, "second");
|
7502
7685
|
num2int_with_frac(s, positive_inf);
|
7503
7686
|
case 5:
|
7687
|
+
check_numeric(vmin, "minute");
|
7504
7688
|
num2int_with_frac(min, 5);
|
7505
7689
|
case 4:
|
7690
|
+
check_numeric(vh, "hour");
|
7506
7691
|
num2int_with_frac(h, 4);
|
7507
7692
|
case 3:
|
7693
|
+
check_numeric(vd, "cwday");
|
7508
7694
|
num2int_with_frac(d, 3);
|
7509
7695
|
case 2:
|
7696
|
+
check_numeric(vw, "cweek");
|
7510
7697
|
w = NUM2INT(vw);
|
7511
7698
|
case 1:
|
7699
|
+
check_numeric(vy, "year");
|
7512
7700
|
y = vy;
|
7513
7701
|
}
|
7514
7702
|
|
@@ -7520,9 +7708,9 @@ datetime_s_commercial(int argc, VALUE *argv, VALUE klass)
|
|
7520
7708
|
&nth, &ry,
|
7521
7709
|
&rw, &rd, &rjd,
|
7522
7710
|
&ns))
|
7523
|
-
rb_raise(
|
7711
|
+
rb_raise(eDateError, "invalid date");
|
7524
7712
|
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
|
7525
|
-
rb_raise(
|
7713
|
+
rb_raise(eDateError, "invalid date");
|
7526
7714
|
canon24oc();
|
7527
7715
|
|
7528
7716
|
rjd2 = jd_local_to_utc(rjd,
|
@@ -7591,9 +7779,9 @@ datetime_s_weeknum(int argc, VALUE *argv, VALUE klass)
|
|
7591
7779
|
&nth, &ry,
|
7592
7780
|
&rw, &rd, &rjd,
|
7593
7781
|
&ns))
|
7594
|
-
rb_raise(
|
7782
|
+
rb_raise(eDateError, "invalid date");
|
7595
7783
|
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
|
7596
|
-
rb_raise(
|
7784
|
+
rb_raise(eDateError, "invalid date");
|
7597
7785
|
canon24oc();
|
7598
7786
|
|
7599
7787
|
rjd2 = jd_local_to_utc(rjd,
|
@@ -7660,9 +7848,9 @@ datetime_s_nth_kday(int argc, VALUE *argv, VALUE klass)
|
|
7660
7848
|
&nth, &ry,
|
7661
7849
|
&rm, &rn, &rk, &rjd,
|
7662
7850
|
&ns))
|
7663
|
-
rb_raise(
|
7851
|
+
rb_raise(eDateError, "invalid date");
|
7664
7852
|
if (!c_valid_time_p(h, min, s, &rh, &rmin, &rs))
|
7665
|
-
rb_raise(
|
7853
|
+
rb_raise(eDateError, "invalid date");
|
7666
7854
|
canon24oc();
|
7667
7855
|
|
7668
7856
|
rjd2 = jd_local_to_utc(rjd,
|
@@ -7805,7 +7993,7 @@ dt_new_by_frags(VALUE klass, VALUE hash, VALUE sg)
|
|
7805
7993
|
}
|
7806
7994
|
|
7807
7995
|
if (NIL_P(hash))
|
7808
|
-
rb_raise(
|
7996
|
+
rb_raise(eDateError, "invalid date");
|
7809
7997
|
|
7810
7998
|
if (NIL_P(ref_hash("jd")) &&
|
7811
7999
|
NIL_P(ref_hash("yday")) &&
|
@@ -7832,7 +8020,7 @@ dt_new_by_frags(VALUE klass, VALUE hash, VALUE sg)
|
|
7832
8020
|
}
|
7833
8021
|
|
7834
8022
|
if (NIL_P(jd))
|
7835
|
-
rb_raise(
|
8023
|
+
rb_raise(eDateError, "invalid date");
|
7836
8024
|
|
7837
8025
|
{
|
7838
8026
|
int rh, rmin, rs;
|
@@ -7841,7 +8029,7 @@ dt_new_by_frags(VALUE klass, VALUE hash, VALUE sg)
|
|
7841
8029
|
NUM2INT(ref_hash("min")),
|
7842
8030
|
NUM2INT(ref_hash("sec")),
|
7843
8031
|
&rh, &rmin, &rs))
|
7844
|
-
rb_raise(
|
8032
|
+
rb_raise(eDateError, "invalid date");
|
7845
8033
|
|
7846
8034
|
df = time_to_df(rh, rmin, rs);
|
7847
8035
|
}
|
@@ -7951,7 +8139,7 @@ datetime_s_strptime(int argc, VALUE *argv, VALUE klass)
|
|
7951
8139
|
|
7952
8140
|
/*
|
7953
8141
|
* call-seq:
|
7954
|
-
* DateTime.parse(string='-4712-01-01T00:00:00+00:00'[, comp=true[, start=Date::ITALY]]) -> datetime
|
8142
|
+
* DateTime.parse(string='-4712-01-01T00:00:00+00:00'[, comp=true[, start=Date::ITALY]], limit: 128) -> datetime
|
7955
8143
|
*
|
7956
8144
|
* Parses the given representation of date and time, and creates a
|
7957
8145
|
* DateTime object. This method does not function as a validator.
|
@@ -7965,13 +8153,18 @@ datetime_s_strptime(int argc, VALUE *argv, VALUE klass)
|
|
7965
8153
|
* #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
|
7966
8154
|
* DateTime.parse('3rd Feb 2001 04:05:06 PM')
|
7967
8155
|
* #=> #<DateTime: 2001-02-03T16:05:06+00:00 ...>
|
8156
|
+
*
|
8157
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
8158
|
+
* You can stop this check by passing `limit: nil`, but note that
|
8159
|
+
* it may take a long time to parse.
|
7968
8160
|
*/
|
7969
8161
|
static VALUE
|
7970
8162
|
datetime_s_parse(int argc, VALUE *argv, VALUE klass)
|
7971
8163
|
{
|
7972
|
-
VALUE str, comp, sg;
|
8164
|
+
VALUE str, comp, sg, opt;
|
7973
8165
|
|
7974
|
-
rb_scan_args(argc, argv, "03", &str, &comp, &sg);
|
8166
|
+
rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt);
|
8167
|
+
if (!NIL_P(opt)) argc--;
|
7975
8168
|
|
7976
8169
|
switch (argc) {
|
7977
8170
|
case 0:
|
@@ -7983,18 +8176,20 @@ datetime_s_parse(int argc, VALUE *argv, VALUE klass)
|
|
7983
8176
|
}
|
7984
8177
|
|
7985
8178
|
{
|
7986
|
-
|
7987
|
-
|
7988
|
-
|
7989
|
-
|
7990
|
-
|
8179
|
+
int argc2 = 2;
|
8180
|
+
VALUE argv2[3];
|
8181
|
+
argv2[0] = str;
|
8182
|
+
argv2[1] = comp;
|
8183
|
+
argv2[2] = opt;
|
8184
|
+
if (!NIL_P(opt)) argc2++;
|
8185
|
+
VALUE hash = date_s__parse(argc2, argv2, klass);
|
7991
8186
|
return dt_new_by_frags(klass, hash, sg);
|
7992
8187
|
}
|
7993
8188
|
}
|
7994
8189
|
|
7995
8190
|
/*
|
7996
8191
|
* call-seq:
|
7997
|
-
* DateTime.iso8601(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime
|
8192
|
+
* DateTime.iso8601(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime
|
7998
8193
|
*
|
7999
8194
|
* Creates a new DateTime object by parsing from a string according to
|
8000
8195
|
* some typical ISO 8601 formats.
|
@@ -8005,13 +8200,18 @@ datetime_s_parse(int argc, VALUE *argv, VALUE klass)
|
|
8005
8200
|
* #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
|
8006
8201
|
* DateTime.iso8601('2001-W05-6T04:05:06+07:00')
|
8007
8202
|
* #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
|
8203
|
+
*
|
8204
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
8205
|
+
* You can stop this check by passing `limit: nil`, but note that
|
8206
|
+
* it may take a long time to parse.
|
8008
8207
|
*/
|
8009
8208
|
static VALUE
|
8010
8209
|
datetime_s_iso8601(int argc, VALUE *argv, VALUE klass)
|
8011
8210
|
{
|
8012
|
-
VALUE str, sg;
|
8211
|
+
VALUE str, sg, opt;
|
8013
8212
|
|
8014
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
8213
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
8214
|
+
if (!NIL_P(opt)) argc--;
|
8015
8215
|
|
8016
8216
|
switch (argc) {
|
8017
8217
|
case 0:
|
@@ -8021,27 +8221,37 @@ datetime_s_iso8601(int argc, VALUE *argv, VALUE klass)
|
|
8021
8221
|
}
|
8022
8222
|
|
8023
8223
|
{
|
8024
|
-
|
8224
|
+
int argc2 = 1;
|
8225
|
+
VALUE argv2[2];
|
8226
|
+
argv2[0] = str;
|
8227
|
+
argv2[1] = opt;
|
8228
|
+
if (!NIL_P(opt)) argc2--;
|
8229
|
+
VALUE hash = date_s__iso8601(argc2, argv2, klass);
|
8025
8230
|
return dt_new_by_frags(klass, hash, sg);
|
8026
8231
|
}
|
8027
8232
|
}
|
8028
8233
|
|
8029
8234
|
/*
|
8030
8235
|
* call-seq:
|
8031
|
-
* DateTime.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime
|
8236
|
+
* DateTime.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime
|
8032
8237
|
*
|
8033
8238
|
* Creates a new DateTime object by parsing from a string according to
|
8034
8239
|
* some typical RFC 3339 formats.
|
8035
8240
|
*
|
8036
8241
|
* DateTime.rfc3339('2001-02-03T04:05:06+07:00')
|
8037
8242
|
* #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
|
8243
|
+
*
|
8244
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
8245
|
+
* You can stop this check by passing `limit: nil`, but note that
|
8246
|
+
* it may take a long time to parse.
|
8038
8247
|
*/
|
8039
8248
|
static VALUE
|
8040
8249
|
datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass)
|
8041
8250
|
{
|
8042
|
-
VALUE str, sg;
|
8251
|
+
VALUE str, sg, opt;
|
8043
8252
|
|
8044
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
8253
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
8254
|
+
if (!NIL_P(opt)) argc--;
|
8045
8255
|
|
8046
8256
|
switch (argc) {
|
8047
8257
|
case 0:
|
@@ -8051,27 +8261,37 @@ datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass)
|
|
8051
8261
|
}
|
8052
8262
|
|
8053
8263
|
{
|
8054
|
-
|
8264
|
+
int argc2 = 1;
|
8265
|
+
VALUE argv2[2];
|
8266
|
+
argv2[0] = str;
|
8267
|
+
argv2[1] = opt;
|
8268
|
+
if (!NIL_P(opt)) argc2++;
|
8269
|
+
VALUE hash = date_s__rfc3339(argc2, argv2, klass);
|
8055
8270
|
return dt_new_by_frags(klass, hash, sg);
|
8056
8271
|
}
|
8057
8272
|
}
|
8058
8273
|
|
8059
8274
|
/*
|
8060
8275
|
* call-seq:
|
8061
|
-
* DateTime.xmlschema(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime
|
8276
|
+
* DateTime.xmlschema(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime
|
8062
8277
|
*
|
8063
8278
|
* Creates a new DateTime object by parsing from a string according to
|
8064
8279
|
* some typical XML Schema formats.
|
8065
8280
|
*
|
8066
8281
|
* DateTime.xmlschema('2001-02-03T04:05:06+07:00')
|
8067
8282
|
* #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
|
8283
|
+
*
|
8284
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
8285
|
+
* You can stop this check by passing `limit: nil`, but note that
|
8286
|
+
* it may take a long time to parse.
|
8068
8287
|
*/
|
8069
8288
|
static VALUE
|
8070
8289
|
datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass)
|
8071
8290
|
{
|
8072
|
-
VALUE str, sg;
|
8291
|
+
VALUE str, sg, opt;
|
8073
8292
|
|
8074
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
8293
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
8294
|
+
if (!NIL_P(opt)) argc--;
|
8075
8295
|
|
8076
8296
|
switch (argc) {
|
8077
8297
|
case 0:
|
@@ -8081,28 +8301,38 @@ datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass)
|
|
8081
8301
|
}
|
8082
8302
|
|
8083
8303
|
{
|
8084
|
-
|
8304
|
+
int argc2 = 1;
|
8305
|
+
VALUE argv2[2];
|
8306
|
+
argv2[0] = str;
|
8307
|
+
argv2[1] = opt;
|
8308
|
+
if (!NIL_P(opt)) argc2++;
|
8309
|
+
VALUE hash = date_s__xmlschema(argc2, argv2, klass);
|
8085
8310
|
return dt_new_by_frags(klass, hash, sg);
|
8086
8311
|
}
|
8087
8312
|
}
|
8088
8313
|
|
8089
8314
|
/*
|
8090
8315
|
* call-seq:
|
8091
|
-
* DateTime.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> datetime
|
8092
|
-
* DateTime.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> datetime
|
8316
|
+
* DateTime.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> datetime
|
8317
|
+
* DateTime.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> datetime
|
8093
8318
|
*
|
8094
8319
|
* Creates a new DateTime object by parsing from a string according to
|
8095
8320
|
* some typical RFC 2822 formats.
|
8096
8321
|
*
|
8097
8322
|
* DateTime.rfc2822('Sat, 3 Feb 2001 04:05:06 +0700')
|
8098
8323
|
* #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
|
8324
|
+
*
|
8325
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
8326
|
+
* You can stop this check by passing `limit: nil`, but note that
|
8327
|
+
* it may take a long time to parse.
|
8099
8328
|
*/
|
8100
8329
|
static VALUE
|
8101
8330
|
datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass)
|
8102
8331
|
{
|
8103
|
-
VALUE str, sg;
|
8332
|
+
VALUE str, sg, opt;
|
8104
8333
|
|
8105
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
8334
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
8335
|
+
if (!NIL_P(opt)) argc--;
|
8106
8336
|
|
8107
8337
|
switch (argc) {
|
8108
8338
|
case 0:
|
@@ -8112,7 +8342,12 @@ datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass)
|
|
8112
8342
|
}
|
8113
8343
|
|
8114
8344
|
{
|
8115
|
-
|
8345
|
+
int argc2 = 1;
|
8346
|
+
VALUE argv2[2];
|
8347
|
+
argv2[0] = str;
|
8348
|
+
argv2[1] = opt;
|
8349
|
+
if (!NIL_P(opt)) argc2++;
|
8350
|
+
VALUE hash = date_s__rfc2822(argc2, argv2, klass);
|
8116
8351
|
return dt_new_by_frags(klass, hash, sg);
|
8117
8352
|
}
|
8118
8353
|
}
|
@@ -8126,13 +8361,18 @@ datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass)
|
|
8126
8361
|
*
|
8127
8362
|
* DateTime.httpdate('Sat, 03 Feb 2001 04:05:06 GMT')
|
8128
8363
|
* #=> #<DateTime: 2001-02-03T04:05:06+00:00 ...>
|
8364
|
+
*
|
8365
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
8366
|
+
* You can stop this check by passing `limit: nil`, but note that
|
8367
|
+
* it may take a long time to parse.
|
8129
8368
|
*/
|
8130
8369
|
static VALUE
|
8131
8370
|
datetime_s_httpdate(int argc, VALUE *argv, VALUE klass)
|
8132
8371
|
{
|
8133
|
-
VALUE str, sg;
|
8372
|
+
VALUE str, sg, opt;
|
8134
8373
|
|
8135
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
8374
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
8375
|
+
if (!NIL_P(opt)) argc--;
|
8136
8376
|
|
8137
8377
|
switch (argc) {
|
8138
8378
|
case 0:
|
@@ -8142,27 +8382,42 @@ datetime_s_httpdate(int argc, VALUE *argv, VALUE klass)
|
|
8142
8382
|
}
|
8143
8383
|
|
8144
8384
|
{
|
8145
|
-
|
8385
|
+
int argc2 = 1;
|
8386
|
+
VALUE argv2[2];
|
8387
|
+
argv2[0] = str;
|
8388
|
+
argv2[1] = opt;
|
8389
|
+
if (!NIL_P(opt)) argc2++;
|
8390
|
+
VALUE hash = date_s__httpdate(argc2, argv2, klass);
|
8146
8391
|
return dt_new_by_frags(klass, hash, sg);
|
8147
8392
|
}
|
8148
8393
|
}
|
8149
8394
|
|
8150
8395
|
/*
|
8151
8396
|
* call-seq:
|
8152
|
-
* DateTime.jisx0301(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime
|
8397
|
+
* DateTime.jisx0301(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime
|
8153
8398
|
*
|
8154
8399
|
* Creates a new DateTime object by parsing from a string according to
|
8155
8400
|
* some typical JIS X 0301 formats.
|
8156
8401
|
*
|
8157
8402
|
* DateTime.jisx0301('H13.02.03T04:05:06+07:00')
|
8158
8403
|
* #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
|
8404
|
+
*
|
8405
|
+
* For no-era year, legacy format, Heisei is assumed.
|
8406
|
+
*
|
8407
|
+
* DateTime.jisx0301('13.02.03T04:05:06+07:00')
|
8408
|
+
* #=> #<DateTime: 2001-02-03T04:05:06+07:00 ...>
|
8409
|
+
*
|
8410
|
+
* Raise an ArgumentError when the string length is longer than _limit_.
|
8411
|
+
* You can stop this check by passing `limit: nil`, but note that
|
8412
|
+
* it may take a long time to parse.
|
8159
8413
|
*/
|
8160
8414
|
static VALUE
|
8161
8415
|
datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass)
|
8162
8416
|
{
|
8163
|
-
VALUE str, sg;
|
8417
|
+
VALUE str, sg, opt;
|
8164
8418
|
|
8165
|
-
rb_scan_args(argc, argv, "02", &str, &sg);
|
8419
|
+
rb_scan_args(argc, argv, "02:", &str, &sg, &opt);
|
8420
|
+
if (!NIL_P(opt)) argc--;
|
8166
8421
|
|
8167
8422
|
switch (argc) {
|
8168
8423
|
case 0:
|
@@ -8172,7 +8427,12 @@ datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass)
|
|
8172
8427
|
}
|
8173
8428
|
|
8174
8429
|
{
|
8175
|
-
|
8430
|
+
int argc2 = 1;
|
8431
|
+
VALUE argv2[2];
|
8432
|
+
argv2[0] = str;
|
8433
|
+
argv2[1] = opt;
|
8434
|
+
if (!NIL_P(opt)) argc2++;
|
8435
|
+
VALUE hash = date_s__jisx0301(argc2, argv2, klass);
|
8176
8436
|
return dt_new_by_frags(klass, hash, sg);
|
8177
8437
|
}
|
8178
8438
|
}
|
@@ -8550,17 +8810,24 @@ time_to_datetime(VALUE self)
|
|
8550
8810
|
* call-seq:
|
8551
8811
|
* d.to_time -> time
|
8552
8812
|
*
|
8553
|
-
* Returns a Time object which denotes self.
|
8813
|
+
* Returns a Time object which denotes self. If self is a julian date,
|
8814
|
+
* convert it to a gregorian date before converting it to Time.
|
8554
8815
|
*/
|
8555
8816
|
static VALUE
|
8556
8817
|
date_to_time(VALUE self)
|
8557
8818
|
{
|
8558
|
-
|
8819
|
+
get_d1a(self);
|
8820
|
+
|
8821
|
+
if (m_julian_p(adat)) {
|
8822
|
+
VALUE tmp = d_lite_gregorian(self);
|
8823
|
+
get_d1b(tmp);
|
8824
|
+
adat = bdat;
|
8825
|
+
}
|
8559
8826
|
|
8560
8827
|
return f_local3(rb_cTime,
|
8561
|
-
|
8562
|
-
|
8563
|
-
|
8828
|
+
m_real_year(adat),
|
8829
|
+
INT2FIX(m_mon(adat)),
|
8830
|
+
INT2FIX(m_mday(adat)));
|
8564
8831
|
}
|
8565
8832
|
|
8566
8833
|
/*
|
@@ -9217,6 +9484,7 @@ Init_date_core(void)
|
|
9217
9484
|
*
|
9218
9485
|
*/
|
9219
9486
|
cDate = rb_define_class("Date", rb_cObject);
|
9487
|
+
eDateError = rb_define_class_under(cDate, "Error", rb_eArgError);
|
9220
9488
|
|
9221
9489
|
rb_include_module(cDate, rb_mComparable);
|
9222
9490
|
|
@@ -9323,19 +9591,19 @@ Init_date_core(void)
|
|
9323
9591
|
rb_define_singleton_method(cDate, "strptime", date_s_strptime, -1);
|
9324
9592
|
rb_define_singleton_method(cDate, "_parse", date_s__parse, -1);
|
9325
9593
|
rb_define_singleton_method(cDate, "parse", date_s_parse, -1);
|
9326
|
-
rb_define_singleton_method(cDate, "_iso8601", date_s__iso8601, 1);
|
9594
|
+
rb_define_singleton_method(cDate, "_iso8601", date_s__iso8601, -1);
|
9327
9595
|
rb_define_singleton_method(cDate, "iso8601", date_s_iso8601, -1);
|
9328
|
-
rb_define_singleton_method(cDate, "_rfc3339", date_s__rfc3339, 1);
|
9596
|
+
rb_define_singleton_method(cDate, "_rfc3339", date_s__rfc3339, -1);
|
9329
9597
|
rb_define_singleton_method(cDate, "rfc3339", date_s_rfc3339, -1);
|
9330
|
-
rb_define_singleton_method(cDate, "_xmlschema", date_s__xmlschema, 1);
|
9598
|
+
rb_define_singleton_method(cDate, "_xmlschema", date_s__xmlschema, -1);
|
9331
9599
|
rb_define_singleton_method(cDate, "xmlschema", date_s_xmlschema, -1);
|
9332
|
-
rb_define_singleton_method(cDate, "_rfc2822", date_s__rfc2822, 1);
|
9333
|
-
rb_define_singleton_method(cDate, "_rfc822", date_s__rfc2822, 1);
|
9600
|
+
rb_define_singleton_method(cDate, "_rfc2822", date_s__rfc2822, -1);
|
9601
|
+
rb_define_singleton_method(cDate, "_rfc822", date_s__rfc2822, -1);
|
9334
9602
|
rb_define_singleton_method(cDate, "rfc2822", date_s_rfc2822, -1);
|
9335
9603
|
rb_define_singleton_method(cDate, "rfc822", date_s_rfc2822, -1);
|
9336
|
-
rb_define_singleton_method(cDate, "_httpdate", date_s__httpdate, 1);
|
9604
|
+
rb_define_singleton_method(cDate, "_httpdate", date_s__httpdate, -1);
|
9337
9605
|
rb_define_singleton_method(cDate, "httpdate", date_s_httpdate, -1);
|
9338
|
-
rb_define_singleton_method(cDate, "_jisx0301", date_s__jisx0301, 1);
|
9606
|
+
rb_define_singleton_method(cDate, "_jisx0301", date_s__jisx0301, -1);
|
9339
9607
|
rb_define_singleton_method(cDate, "jisx0301", date_s_jisx0301, -1);
|
9340
9608
|
|
9341
9609
|
rb_define_method(cDate, "initialize", date_initialize, -1);
|