从时区和日期和时间创建时间对象?

时间:2016-11-21 05:22:50

标签: ruby-on-rails ruby

我很尴尬(并且感到震惊)我无法在SO或Google上找到一个好的答案,如果有的话,请随时指出我,但是......

我想要一个函数(理想情况下是纯ruby,但active_support解决方案没问题),其工作原理如下:

输入:一些合理格式的日期时间字符串(例如2016-12-25 12:00)和时区。 偏移量,但是时区,例如America/ChicagoAmerica/New_York)。例如,

make_time_in_zone('2016-12-25 12:00', 'America/Chicago')

输出:表示确切时间点的TimeDateTime对象。也就是说,该功能应该使用时区来计算偏移和夏令时调整,以便您可以知道,例如,America/Chicago在圣诞节中午到达时的UTC时间。

我知道我可以将时区设置为所需的时区,创建Time对象,然后将时区设置回系统1,但我认为这是一个不可接受的解决方案,并且需要一个函数实际上支持这个用例。

2 个答案:

答案 0 :(得分:3)

只需使用in_time_zone来解析时区中的日期。您可以将时区作为参数传递。

in_time_zone(zone = ::Time.zone)

这将完全返回您想要的内容。

'2016-12-25 12:00'.in_time_zone('America/Chicago')
#=> Sun, 25 Dec 2016 12:00:00 CST -06:00

'2016-12-25 12:00'.in_time_zone('America/New_York')
#=> Sun, 25 Dec 2016 12:00:00 EST -05:00

答案 1 :(得分:2)

Rails将当前区域存储在当前线程中,因此最正确的方法是设置区域进行解析。像

这样的东西
var count = 0, string = "Goodbye";
string.split('').forEach(function(){
    count++;
});
console.log(count);

还有更多“hackish”方式,但它不是来自公共API。

Time.use_zone('America/Chicago') { Time.zone.parse('2016-12-25 12:00')}