在Ruby或Rails中,将东部时间转换为UTC的最佳方式是什么



我指的不是

myDateTime = DateTime.now
myDateTime.new_offset(Rational(0, 24))

Time.now.utc

我有一个文本日期是在东部时间。

我可以将该文本日期转换为DateTime。我们称之为eastern_date_time

现在,我们有一个包含DateTime的变量,但除了我们之外,没有人知道它是东部的。我们自己转换它会很麻烦。如果日期为夏令时(夏令时)(今年3月8日至11月1日),我们必须在eastern_date_Time变量中添加4小时才能获得UTC,如果日期为标准时间(ST),我们则必须在eastn_date_timevariable中添加5小时。

我们如何指定我们拥有的是东部日期时间,然后将其转换为UTC。。。决定日期是否在夏令时/夏令时,并正确应用4小时或5小时?

我想将我得到的任何类型的日期转换为UTC,以存储在我的数据库中。

编辑:

使用"in_time_zone",我无法将东部文字时间转换为UTC。我怎样才能实现这个目标?例如

text_time = "Nov 27, 2015 4:30 PM" #given as Eastern
myEasternDateTime = DateTime.parse text_time # => Fri, 27 Nov 2015 16:30:00 +0000 
#now we need to specify that this myEasternDateTime is in fact eastern. However, it's our default UTC. If we use in_time_zone, it just converts the date at UTC to Eastern
myEasternDateTime.in_time_zone('Eastern Time (US & Canada)') # => Fri, 27 Nov 2015 11:30:00 EST -05:00 
myEasternDateTime.utc # => Fri, 27 Nov 2015 16:30:00 +0000 

这不是我们想要的。我们必须指定myEasterDateTime实际上是东部。。。因此,当我们在16:30:00进行myEasterDateTime.utc时,我们最终会得到20:30:00。

我怎样才能做到这一点?

DateTime类中有一个time_in_zone方法:

now.time_in_zone('UTC')

此后,它被重命名为in_time_zone:

DateTime.now.in_time_zone('US/Pacific')
=> Wed, 22 Apr 2015 12:36:33 PDT -07:00 

您目前可以(2023/Rails 7)通过获得所有美国区域的列表

ActiveSupport::TimeZone.us_zones.collect(&:name)

或另一个国家:

ActiveSupport::TimeZone.country_zones('ES')

Time类的对象有一个名为dst?的方法,该方法基本上"告诉"您DST是否适用。因此,您基本上可以确定DST/ST是否适用,并决定添加-4或5。

例如Time.now.dst?如果返回true,则加4,否则加5。

在时区建议的帮助下,我得到了这样的结果。

time_text_1 = "Apr 20, 2015 4:30PM" #Scraped as an Eastern Time, with no offset of -5:00 from UTC included
time_text_2 = "Nov 20, 2015 4:30PM" #Scraped as an Eastern Time, with no offset of -5:00 from UTC included
Time.zone = 'Eastern Time (US & Canada)'
my_time_1 = Time.zone.parse time_text_1 # Output: Mon, 20 Apr 2015 16:30:00 EDT -04:00 
my_time_2 = Time.zone.parse time_text_2 # Output: Fri, 20 Nov 2015 16:30:00 EST -05:00 
my_time_1.utc # Output: 2015-04-20 20:30:00 UTC 
my_time_2.utc # Output: 2015-11-20 21:30:00 UTC 

在编辑后的文章中,您的时间字符串需要从UTC偏移。

第三版:基于注释(仅设置一个字符串表示东部时间,需要考虑夏令时等)

text_time = "Nov 27, 2015 4:30 PM"
the_offset = Time.zone_offset('EST') / (60*60)
eastern_time = DateTime.parse(text_time).change(offset: the_offset.to_s) # Fri, 27 Nov 2015 16:30:00 -0500
eastern_time.utc # Fri, 27 Nov 2015 21:30:00 +0000

最新更新