Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion ext/date/date_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -7190,10 +7190,14 @@ jisx0301_date_format(char *fmt, size_t size, VALUE jd, VALUE y)
c = 'S';
s = 1925;
}
else {
else if (d < 2458605) {
c = 'H';
s = 1988;
}
else {
c = 'R';
s = 2018;
}
snprintf(fmt, size, "%c%02ld" ".%%m.%%d", c, FIX2INT(y) - s);
return fmt;
}
Expand Down
12 changes: 8 additions & 4 deletions ext/date/date_parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -1212,6 +1212,9 @@ parse_iso2(VALUE str, VALUE hash)
return 1;
}

#define JISX0301_ERA_INITIALS "mtshr"
#define JISX0301_DEFAULT_ERA 'H' /* obsolete */

static int
gengo(int c)
{
Expand All @@ -1222,6 +1225,7 @@ gengo(int c)
case 'T': case 't': e = 1911; break;
case 'S': case 's': e = 1925; break;
case 'H': case 'h': e = 1988; break;
case 'R': case 'r': e = 2018; break;
default: e = 0; break;
}
return e;
Expand Down Expand Up @@ -1252,11 +1256,11 @@ parse_jis(VALUE str, VALUE hash)
{
static const char pat_source[] =
#ifndef TIGHT_PARSER
"\\b([mtsh])(\\d+)\\.(\\d+)\\.(\\d+)"
"\\b([" JISX0301_ERA_INITIALS "])(\\d+)\\.(\\d+)\\.(\\d+)"
#else
BOS
FPW_COM FPT_COM
"([mtsh])(\\d+)\\.(\\d+)\\.(\\d+)"
"([" JISX0301_ERA_INITIALS "])(\\d+)\\.(\\d+)\\.(\\d+)"
TEE_FPT COM_FPW
EOS
#endif
Expand Down Expand Up @@ -2954,7 +2958,7 @@ jisx0301_cb(VALUE m, VALUE hash)
s[i] = rb_reg_nth_match(i, m);
}

ep = gengo(NIL_P(s[1]) ? 'h' : *RSTRING_PTR(s[1]));
ep = gengo(NIL_P(s[1]) ? JISX0301_DEFAULT_ERA : *RSTRING_PTR(s[1]));
set_hash("year", f_add(str2num(s[2]), INT2FIX(ep)));
set_hash("mon", str2num(s[3]));
set_hash("mday", str2num(s[4]));
Expand All @@ -2979,7 +2983,7 @@ static int
jisx0301(VALUE str, VALUE hash)
{
static const char pat_source[] =
"\\A\\s*([mtsh])?(\\d{2})\\.(\\d{2})\\.(\\d{2})"
"\\A\\s*([" JISX0301_ERA_INITIALS "])?(\\d{2})\\.(\\d{2})\\.(\\d{2})"
"(?:t"
"(?:(\\d{2}):(\\d{2})(?::(\\d{2})(?:[,.](\\d*))?)?"
"(z|[-+]\\d{2}(?::?\\d{2})?)?)?)?\\s*\\z";
Expand Down
72 changes: 72 additions & 0 deletions test/date/test_date_parse.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1020,6 +1020,15 @@ def test__jisx0301
h = Date._jisx0301('S63.02.03')
assert_equal([1988, 2, 3, nil, nil, nil, nil],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('H31.04.30')
assert_equal([2019, 4, 30, nil, nil, nil, nil],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('H31.05.01')
assert_equal([2019, 5, 1, nil, nil, nil, nil],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('R01.05.01')
assert_equal([2019, 5, 1, nil, nil, nil, nil],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))

h = Date._jisx0301('H13.02.03T04:05:06')
assert_equal([2001, 2, 3, 4, 5, 6, nil],
Expand All @@ -1034,6 +1043,45 @@ def test__jisx0301
assert_equal([2001, 2, 3, 4, 5, 6, 3600],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))

h = Date._jisx0301('H31.04.30T04:05:06')
assert_equal([2019, 4, 30, 4, 5, 6, nil],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('H31.04.30T04:05:06,07')
assert_equal([2019, 4, 30, 4, 5, 6, nil],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('H31.04.30T04:05:06Z')
assert_equal([2019, 4, 30, 4, 5, 6, 0],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('H31.04.30T04:05:06.07+0100')
assert_equal([2019, 4, 30, 4, 5, 6, 3600],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))

h = Date._jisx0301('H31.05.01T04:05:06')
assert_equal([2019, 5, 1, 4, 5, 6, nil],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('H31.05.01T04:05:06,07')
assert_equal([2019, 5, 1, 4, 5, 6, nil],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('H31.05.01T04:05:06Z')
assert_equal([2019, 5, 1, 4, 5, 6, 0],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('H31.05.01T04:05:06.07+0100')
assert_equal([2019, 5, 1, 4, 5, 6, 3600],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))

h = Date._jisx0301('R01.05.01T04:05:06')
assert_equal([2019, 5, 1, 4, 5, 6, nil],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('R01.05.01T04:05:06,07')
assert_equal([2019, 5, 1, 4, 5, 6, nil],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('R01.05.01T04:05:06Z')
assert_equal([2019, 5, 1, 4, 5, 6, 0],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
h = Date._jisx0301('R01.05.01T04:05:06.07+0100')
assert_equal([2019, 5, 1, 4, 5, 6, 3600],
h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))

h = Date._jisx0301('')
assert_equal({}, h)

Expand Down Expand Up @@ -1126,9 +1174,33 @@ def test_jisx0301
assert_equal(Date.new(2001,2,3), d)
assert_equal(Date::ITALY + 10, d.start)

d = Date.jisx0301('H31.04.30', Date::ITALY + 10)
assert_equal(Date.new(2019,4,30), d)
assert_equal(Date::ITALY + 10, d.start)

d = Date.jisx0301('H31.05.01', Date::ITALY + 10)
assert_equal(Date.new(2019,5,1), d)
assert_equal(Date::ITALY + 10, d.start)

d = Date.jisx0301('R01.05.01', Date::ITALY + 10)
assert_equal(Date.new(2019,5,1), d)
assert_equal(Date::ITALY + 10, d.start)

d = DateTime.jisx0301('H13.02.03T04:05:06+07:00', Date::ITALY + 10)
assert_equal(DateTime.new(2001,2,3,4,5,6,'+07:00'), d)
assert_equal(Date::ITALY + 10, d.start)

d = DateTime.jisx0301('H31.04.30T04:05:06+07:00', Date::ITALY + 10)
assert_equal(DateTime.new(2019,4,30,4,5,6,'+07:00'), d)
assert_equal(Date::ITALY + 10, d.start)

d = DateTime.jisx0301('H31.05.01T04:05:06+07:00', Date::ITALY + 10)
assert_equal(DateTime.new(2019,5,1,4,5,6,'+07:00'), d)
assert_equal(Date::ITALY + 10, d.start)

d = DateTime.jisx0301('R01.05.01T04:05:06+07:00', Date::ITALY + 10)
assert_equal(DateTime.new(2019,5,1,4,5,6,'+07:00'), d)
assert_equal(Date::ITALY + 10, d.start)
end

def test_given_string
Expand Down
7 changes: 6 additions & 1 deletion test/date/test_date_strftime.rb
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,8 @@ def test__different_format
assert_equal('S64.01.07', Date.parse('1989-01-07').jisx0301)
assert_equal('H01.01.08', Date.parse('1989-01-08').jisx0301)
assert_equal('H18.09.01', Date.parse('2006-09-01').jisx0301)
assert_equal('H31.04.30', Date.parse('2019-04-30').jisx0301)
assert_equal('R01.05.01', Date.parse('2019-05-01').jisx0301)

%w(M06.01.01
M45.07.29
Expand All @@ -414,7 +416,10 @@ def test__different_format
S01.12.25
S64.01.07
H01.01.08
H18.09.01).each do |s|
H18.09.01
H31.04.30
R01.05.01
).each do |s|
assert_equal(s, Date.parse(s).jisx0301)
end

Expand Down