你如何让DateTime.parse返回你所在时区的时间?

dan*_*dan 18 ruby date

我需要这个

 require 'date'
 DateTime.parse "Mon, Dec 27 6:30pm"
Run Code Online (Sandbox Code Playgroud)

在EDT时区中返回日期时间为下午6:30,但它以UTC格式返回一个.如何获得EST DateTime或将UTC转换为EDT DateTime,其值为6:30 pm?

dan*_*dan 15

好的,我将回答我自己的问题

require 'time'
ENV["TZ"] = "US/Eastern"
Time.parse("Mon, Dec 27 6:30pm").to_datetime
=> #<DateTime: 2011-12-27T18:30:00-05:00 (117884327/48,-5/24,2299161)> 
Run Code Online (Sandbox Code Playgroud)


bra*_*rad 12

在Rails中,这对我很有用

DateTime.parse "Mon, Dec 27 6:30pm #{Time.zone}"
Run Code Online (Sandbox Code Playgroud)

但它不适用于vanilla Ruby.


Sea*_*ris 9

最后答案;-)

require 'date'
estHoursOffset = -5
estOffset = Rational(estHoursOffset, 24)
date = (DateTime.parse("Mon, Dec 27 6:30pm") - (estHoursOffset/24.0)).new_offset(estOffset)
Run Code Online (Sandbox Code Playgroud)

(或EDT为-4)


Jos*_*ter 5

DateTime#change()

您可以在解析它后尝试使用change()它来更改时区偏移量:

DateTime.parse( "Mon, Dec 27 6:30pm" ).change( offset: '-0400' )
# => Wed, 27 Dec 2017 18:30:00 -0400
Run Code Online (Sandbox Code Playgroud)

您也可以只使用时间:

DateTime.parse( "Mon, Dec 27 6:30pm" ).change( offset: '-4' )
# => Wed, 27 Dec 2017 18:30:00 -0400
Run Code Online (Sandbox Code Playgroud)

但是,请注意,您不能使用整数:

DateTime.parse( "Mon, Dec 27 6:30pm" ).change( offset: -4 )
# => Wed, 27 Dec 2017 18:30:00 +0000
Run Code Online (Sandbox Code Playgroud)

如果您需要根据时区确定要使用的正确偏移量,您可以执行以下操作:

offset = ( Time.zone_offset('EDT') / 1.hour ).to_s
# => "-4"

DateTime.parse( "Mon, Dec 27 6:30pm" ).change( offset: offset )
# => Wed, 27 Dec 2017 18:30:00 -0400
Run Code Online (Sandbox Code Playgroud)

您还可以change()手动设置其他部分DateTime,例如将其设置hour为中午:

DateTime.parse( "Mon, Dec 27 6:30pm" ).change( offset: '-4', hour: 12 )
# => Wed, 27 Dec 2017 12:00:00 -0400
Run Code Online (Sandbox Code Playgroud)

小心那个,因为你可以看到它也清除了分钟数。

这是该方法的文档change()http://api.rubyonrails.org/v5.1/classes/DateTime.html#method-i-change