Kellen Kyros
Kellen Kyros

Reputation: 21

Ruby: Datetime to UTC conversion

I am trying to convert the below date and time combination to UTC

from_date: "2017-06-19",from_time: "14:00"
to_date: "2017-06-19", to_time: "23:00"
Timezone: EDT

I am using below piece of code for conversion

Date.parse(dt).to_datetime + Time.parse(t).utc.seconds_since_midnight.seconds

And it gives the wrong date value for the to_date & to_time combination.

Output:

Date.parse(from_date).to_datetime +
   Time.parse(from_time).utc.seconds_since_midnight.seconds
#⇒ **Mon, 19 Jun 2017 18:00:00 +0000**

Date.parse(to_date).to_datetime +
   Time.parse(to_time).utc.seconds_since_midnight.seconds
#⇒ **Mon, 19 Jun 2017 03:00:00 +0000**

Above conversion should give "Tue, 20 Jun 2017 03:00:00 +0000" instead.

Upvotes: 1

Views: 2425

Answers (3)

Thanh
Thanh

Reputation: 8604

I think this is shorter:

from_date = "2017-06-19"
from_time = "14:00"
DateTime.strptime("#{from_date}T#{from_time}ZEDT", "%Y-%m-%dT%H:%MZ%z").utc
=> Mon, 19 Jun 2017 18:00:00 +000

to_date = "2017-06-19" 
to_time = "23:00"

DateTime.strptime("#{to_date}T#{to_time}ZEDT", "%Y-%m-%dT%H:%MZ%z").utc
=> Tue, 20 Jun 2017 03:00:00 +0000

Upvotes: 0

Kellen Kyros
Kellen Kyros

Reputation: 21

Below line of codes worked for me:

parsed_date = Time.zone.parse(from_date).strftime('%Y-%m-%d')
parsed_time = Time.zone.parse(from_time).strftime('%T')
Time.parse(parsed_date + ' ' + parsed_time).utc.strftime('%F %T')

Upvotes: 1

Michael Larkin
Michael Larkin

Reputation: 11

require 'time'

from = Time.parse "2017-06-19 14:00 US/Eastern"
=> 2017-06-19 14:00:00 -0400 
from.utc
=> 2017-06-19 18:00:00 UTC

to = Time.parse "2017-06-19 23:00 US/Eastern"
=> 2017-06-19 23:00:00 -0400 
to.utc
=> 2017-06-20 03:00:00 UTC 

Though you can also specify the timezone offset without using the string, doing it this way handles Daylight Savings Time.

Upvotes: 0

Related Questions