git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66078 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2018-11-28 14:08:33 +00:00
Родитель bdfc701b85
Коммит ab73b30539
2 изменённых файлов: 14 добавлений и 8 удалений

Просмотреть файл

@ -547,11 +547,11 @@ module TestTimeTZ::WithTZ
def subtest_at(time_class, tz, tzarg, tzname, abbr, utc_offset) def subtest_at(time_class, tz, tzarg, tzname, abbr, utc_offset)
h, m = (utc_offset / 60).divmod(60) h, m = (utc_offset / 60).divmod(60)
utc = time_class.utc(2018, 9, 1, 12, 0, 0) utc = time_class.utc(2018, 9, 1, 12, 0, 0)
t = time_class.at(utc, tzarg) t = time_class.at(utc, in: tzarg)
assert_equal([2018, 9, 1, 12+h, m, 0, tz], [t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.zone]) assert_equal([2018, 9, 1, 12+h, m, 0, tz], [t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.zone])
assert_equal(utc.to_i, t.to_i) assert_equal(utc.to_i, t.to_i)
utc = utc.to_i utc = utc.to_i
t = time_class.at(utc, tzarg) t = time_class.at(utc, in: tzarg)
assert_equal([2018, 9, 1, 12+h, m, 0, tz], [t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.zone]) assert_equal([2018, 9, 1, 12+h, m, 0, tz], [t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.zone])
assert_equal(utc, t.to_i) assert_equal(utc, t.to_i)
end end

18
time.c
Просмотреть файл

@ -2686,7 +2686,7 @@ get_scale(VALUE unit)
* can be an Integer, Float, Rational, or other Numeric. * can be an Integer, Float, Rational, or other Numeric.
* non-portable feature allows the offset to be negative on some systems. * non-portable feature allows the offset to be negative on some systems.
* *
* If +tz+ argument is given, the result is in that timezone or UTC offset, or * If +in+ argument is given, the result is in that timezone or UTC offset, or
* if a numeric argument is given, the result is in local time. * if a numeric argument is given, the result is in local time.
* *
* Time.at(0) #=> 1969-12-31 18:00:00 -0600 * Time.at(0) #=> 1969-12-31 18:00:00 -0600
@ -2701,13 +2701,19 @@ get_scale(VALUE unit)
static VALUE static VALUE
time_s_at(int argc, VALUE *argv, VALUE klass) time_s_at(int argc, VALUE *argv, VALUE klass)
{ {
VALUE time, t, unit = Qundef, zone = Qnil; VALUE time, t, unit = Qundef, zone = Qundef, opts;
wideval_t timew; wideval_t timew;
if (argc > 1 && rb_obj_respond_to(argv[argc-1], id_utc_to_local, Qfalse)) { argc = rb_scan_args(argc, argv, "12:", &time, &t, &unit, &opts);
zone = argv[--argc]; if (!NIL_P(opts)) {
ID ids[1];
VALUE vals[numberof(ids)];
CONST_ID(ids[0], "in");
rb_get_kwargs(opts, ids, 0, 1, vals);
zone = vals[0];
} }
if (rb_scan_args(argc, argv, "12", &time, &t, &unit) >= 2) { if (argc >= 2) {
int scale = argc == 3 ? get_scale(unit) : 1000000; int scale = argc == 3 ? get_scale(unit) : 1000000;
time = num_exact(time); time = num_exact(time);
t = num_exact(t); t = num_exact(t);
@ -2725,7 +2731,7 @@ time_s_at(int argc, VALUE *argv, VALUE klass)
timew = rb_time_magnify(v2w(num_exact(time))); timew = rb_time_magnify(v2w(num_exact(time)));
t = time_new_timew(klass, timew); t = time_new_timew(klass, timew);
} }
if (!NIL_P(zone)) { if (zone != Qundef) {
time_zonelocal(t, zone); time_zonelocal(t, zone);
} }