On Thursday, December 3, 2020 at 1:33:42 PM UTC-6 Jeremy Evans wrote:

> On Thu, Dec 3, 2020 at 11:03 AM J. Lewis Muir wrote:
>
>> On Thursday, December 3, 2020 at 12:00:20 AM UTC-6 Jeremy Evans wrote:
>>
>>> If you can use Ruby 2.0, you should be able to easily use the mysql 
>>> gem.  Current Sequel runs fine on Ruby 2.0.  You will have to switch to 
>>> Sequel.datetime_class = DateTime, though, because timezone support was not 
>>> added to Time until Ruby 2.6.
>>>
>>
>> I understand that time zone support was only added to Time in Ruby 2.6, 
>> but for Ruby 2.0, I don't understand how DateTime is able to handle time 
>> zones any better than Time.  I don't see any support for named time zones 
>> in Time nor DateTime as of Ruby 2.0; I just see support for a UTC offset.  
>> So, I'm not understanding the need for Sequel.datetime_class = DateTime.  
>> Could you explain?
>>
>
> Before Ruby 2.6, Time didn't handle timezones, and you can't take an 
> existing Time instance and convert it to a new timezone offset (unlike with 
> DateTime).  You could only convert it from local to utc or vice versa.
>
> Before Ruby 2.2, Time cannot even deal with parsed times not in the local 
> zone:
>
> $ruby21  -rtime -e 'p Time.parse("2020-10-20 10:20:30-03:00")'
> 2020-10-20 06:20:30 -0700
> $ ruby22  -rtime -e 'p Time.parse("2020-10-20 10:20:30-03:00")'
> 2020-10-20 10:20:30 -0300
>
> DateTime itself doesn't handle timezones in any version, but Sequel can 
> use TZInfo to figure out the correct offset, and use 
> DateTime's offset support to set the offset correctly.  Sequel can't do 
> that with Time, since Time doesn't have support for it.
>

Thank you for the explanation!  I looked at Sequel's 
lib/sequel/timezones.rb, and I see it using DateTime#new_offset.  I had no 
idea this would work in Ruby 2.0 because that instance method does not 
exist in the docs:

* https://ruby-doc.org/stdlib-2.0.0/libdoc/date/rdoc/DateTime.html
* https://ruby-doc.org/stdlib-2.0.0/libdoc/date/rdoc/Date.html

But it's listed in "DateTime.instance_methods", and "ri 
DateTime.new_offset" knows about it.  Looking at the Ruby source, if I'm 
reading it right, that method is private in Ruby 2.0:

  https://github.com/ruby/ruby/blob/ruby_2_0_0/ext/date/date_core.c#L9523

I guess that would explain why it was not in the docs.

Thanks!

Lewis

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sequel-talk/2bb4e703-6d39-4d1a-b967-b99a0980b079n%40googlegroups.com.

Reply via email to