When the date is 28 Feb in the local timezone and 27 in the UTC,
the leap second info is wrongly calculated, and the Time for 1 Mar
created with a timezone resulted in an invalid date, 30 Feb.
Previously Time.now was switched to use Time.new as it added support for
the in: argument. Unfortunately because Class#new is a cfunc this
requires always allocating a Hash.
This commit switches Time.now back to using a builtin time_s_now. This
avoids the extra Hash allocation and is about 3x faster.
$ benchmark-driver -e './ruby;3.1::~/.rubies/ruby-3.1.0/bin/ruby;3.0::~/.rubies/ruby-3.0.2/bin/ruby' benchmark/time_now.yml
Warming up --------------------------------------
Time.now 6.704M i/s - 6.710M times in 1.000814s (149.16ns/i, 328clocks/i)
Time.now(in: "+09:00") 2.003M i/s - 2.112M times in 1.054330s (499.31ns/i)
Calculating -------------------------------------
./ruby 3.1 3.0
Time.now 7.693M 2.763M 6.394M i/s - 20.113M times in 2.614428s 7.278710s 3.145572s
Time.now(in: "+09:00") 2.030M 1.260M 1.617M i/s - 6.008M times in 2.960132s 4.769378s 3.716537s
Comparison:
Time.now
./ruby: 7693129.7 i/s
3.0: 6394109.2 i/s - 1.20x slower
3.1: 2763282.5 i/s - 2.78x slower
Time.now(in: "+09:00")
./ruby: 2029757.4 i/s
3.0: 1616652.3 i/s - 1.26x slower
3.1: 1259776.2 i/s - 1.61x slower
Move section on internal details out of the class-level documentation,
since users do not need to know that. Update it to use
Integer(T_BIGNUM) instead of Bignum.
Fixes [Misc #17580]
* fraction -> subsecond
for consistency with method name
* The sentence,
"A non-portable feature allows the offset to be negative on some systems.",
is removed.
Time before 1970 should work portably now.
If localtime() doesn't work before 1970,
Ruby should extrapolate it.
* Time::new -> Time.new
"::" for method call is not common notation now.
* Time#to_i truncates subsecond
* Time#to_f approximates a value in Time object
* Time#to_r
The sentence,
"You can use this method to convert _time_ to another Epoch.",
is removed.
It is not clear because no actual example of "another Epoch" is given.
* Time#usec truncates fraction of microseconds.
* Time#nsec truncates fraction of nanoseconds.
* describe Time#inspect shows subsecond since Ruby 2.7.0.
Not every compilers understand that rb_raise does not return. When a
function does not end with a return statement, such compilers can issue
warnings. We would better tell them about reachabilities.