mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Timezone at Time#+ and Time#-
* time.c (time_add): support for Timezone. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64958 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
e94b5221c4
commit
fcf308e5fc
4 changed files with 29 additions and 1 deletions
3
NEWS
3
NEWS
|
@ -263,7 +263,8 @@ sufficient information, see the ChangeLog file or Redmine
|
||||||
* New features:
|
* New features:
|
||||||
|
|
||||||
* `Time.new` and `Time#getlocal` accept a timezone object as
|
* `Time.new` and `Time#getlocal` accept a timezone object as
|
||||||
well as UTC offset string. [Feature #14850]
|
well as UTC offset string. `Time#+`, `Time#-` and `Time#succ`
|
||||||
|
also preserve the timezone. [Feature #14850]
|
||||||
|
|
||||||
* `TracePoint`
|
* `TracePoint`
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,19 @@ describe "Time#+" do
|
||||||
(Time.new(2012, 1, 1, 0, 0, 0, 3600) + 10).utc_offset.should == 3600
|
(Time.new(2012, 1, 1, 0, 0, 0, 3600) + 10).utc_offset.should == 3600
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ruby_version_is "2.6" do
|
||||||
|
it "returns a time with the same timezone as self" do
|
||||||
|
zone = mock("timezone")
|
||||||
|
zone.should_receive(:local_to_utc).and_return(Time.utc(2012, 1, 1, 6, 30, 0))
|
||||||
|
zone.should_receive(:utc_to_local).and_return(Time.utc(2012, 1, 1, 12, 0, 10))
|
||||||
|
t = Time.new(2012, 1, 1, 12, 0, 0, zone) + 10
|
||||||
|
t.zone.should == zone
|
||||||
|
t.utc_offset.should == 19800
|
||||||
|
t.to_a[0, 6].should == [10, 0, 12, 1, 1, 2012]
|
||||||
|
t.should == Time.utc(2012, 1, 1, 6, 30, 10)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it "does not return a subclass instance" do
|
it "does not return a subclass instance" do
|
||||||
c = Class.new(Time)
|
c = Class.new(Time)
|
||||||
x = c.now + 1
|
x = c.now + 1
|
||||||
|
|
|
@ -536,4 +536,10 @@ class TestTimeTZ::WithTZ < Test::Unit::TestCase
|
||||||
t = Time.new(2018, 9, 1, 12, 0, 0, tz)
|
t = Time.new(2018, 9, 1, 12, 0, 0, tz)
|
||||||
assert_equal("+0900 #{abbr}", t.strftime("%z %Z"))
|
assert_equal("+0900 #{abbr}", t.strftime("%z %Z"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_plus_with_timezone
|
||||||
|
t = Time.new(2018, 9, 1, 12, 0, 0, tz) + 4000
|
||||||
|
assert_equal([2018, 9, 1, 13, 6, 40, tz], [t.year, t.mon, t.mday, t.hour, t.min, t.sec, t.zone])
|
||||||
|
assert_equal(Time.utc(2018, 9, 1, 4, 6, 40), t)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
8
time.c
8
time.c
|
@ -3899,6 +3899,11 @@ time_add(struct time_object *tobj, VALUE torig, VALUE offset, int sign)
|
||||||
GetTimeval(result, tobj);
|
GetTimeval(result, tobj);
|
||||||
TZMODE_SET_FIXOFF(tobj, off);
|
TZMODE_SET_FIXOFF(tobj, off);
|
||||||
}
|
}
|
||||||
|
else if (TZMODE_LOCALTIME_P(tobj)) {
|
||||||
|
VALUE zone = tobj->vtm.zone;
|
||||||
|
GetTimeval(result, tobj);
|
||||||
|
tobj->vtm.zone = zone;
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -3982,6 +3987,9 @@ rb_time_succ(VALUE time)
|
||||||
time = time_new_timew(rb_cTime, wadd(tobj->timew, WINT2FIXWV(TIME_SCALE)));
|
time = time_new_timew(rb_cTime, wadd(tobj->timew, WINT2FIXWV(TIME_SCALE)));
|
||||||
GetTimeval(time, tobj2);
|
GetTimeval(time, tobj2);
|
||||||
TZMODE_COPY(tobj2, tobj);
|
TZMODE_COPY(tobj2, tobj);
|
||||||
|
if (TZMODE_LOCALTIME_P(tobj2) && maybe_tzobj_p(tobj2->vtm.zone)) {
|
||||||
|
zone_localtime(tobj2->vtm.zone, time);
|
||||||
|
}
|
||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue