我正在尝试从我创建的方法中减去 3 小时,但出现错误

I am trying to subtract 3 hours from a method that I have created but I am getting an error

我已经成功创建了一个名为 dst_datechange 的 DST 方法,该方法采用日期,使用 Time.parse 解析出来。它看起来像这样:

require 'time'
def dst_datechange(date)
  date = Time.parse(date.to_s) # if date.class.eql?(String)
  case
  when (date > Time.parse('March 11, 2018 2:00am')) && (date < 
Time.parse('November 4, 2018 2:00am'))
    date = Time.parse('November 4, 2018 2:00am')
    puts "the date rounded to november 4, 2018"
  when (date > Time.parse('November 4 2018, 2:00am')) && (date < 
Time.parse('March 10, 2:00am'))
    date = Time.parse('March 10, 2019 2:00am')
    puts "the date rounded to march 10 2019"
  when (date > Time.parse('March 10, 2019 2:00am')) && (date < 
Time.parse('November 3, 2019 2:00am'))
    date = Time.parse('November 3, 2019 2:00am')
  when (date > Time.parse('November 3, 2019 2:00am')) && (date < 
Time.parse('March 8, 2020 2:00am'))
    date = Time.parse('March 8, 2020 2:00am')
  when (date > Time.parse('March 8, 2020 2:00am')) && (date < 
Time.parse('November 1, 2020 2:00am'))
    date = Time.parse ('November 1, 2020 2:00am')
  else
    raise "The date #{date} does not match any dst date parameter"
  end
  date
  puts "the new DST date is #{date}"
end

我的 "puts" 显示这个...

the date rounded to: november 4, 2018 
 the new DST date is now: 2018-11-04 02:00:00 -0600

现在我收到了正确的日期,我有一个步骤是 dst_datechange 并执行减法,但是,我收到一条错误消息:

TypeError: no implicit conversion of Integer into Array

我不确定我做错了什么,但我知道它很可能是一个格式问题,我试图用一个时间对象减去一个日期时间对象。这是我下面的步骤,堆栈跟踪将失败指向:

  date = (dst_datechange(Time.now) - (60*60*3))
  puts "the date is now adjusted 3 hours back from 2:00am:  #{date} "
end

我不确定如何格式化 (60*60*3) 以从新的 11 月 2018-11-04 02:00:00 -0600 日期减去 3 小时,然后基本上将其回滚到 2018-11-03 23:00:00 -0600

您需要指定要减去小时数。尝试:

(Time.now - 3.hours).to_datetime

或者,如果使用 ActiveSupport,您可以指定三个小时前:

3.hours.ago

你的方法 def dst_datechange(date) 没有 return 你想要的日期,而是把你的字符串。

当您在第二部分 dst_datechange(Time.now) 中调用它时,return 不是日期,而是最后一个的 return 值放。

在 dst_datechange 方法中最后一次输入后,再次尝试调用 'date':

when (date > Time.parse('March 8, 2020 2:00am')) && (date < Time.parse('November 1, 2020 2:00am'))
date = Time.parse ('November 1, 2020 2:00am')
  else
    raise "The date #{date} does not match any dst date parameter"
  end
  puts "the new DST date is #{date}"
  date
end

自 2007 年以来,在美国和加拿大的大多数司法管辖区,夏令时 ("DST") 开始于三月的第二个星期日 2:00am,结束于 [=34= 】 十一月的第一个星期天。在墨西哥,夏令时从 4 月的第一个星期日 2:00am 开始,到 10 月的最后一个星期日 2:00am 结束。世界其他地方的体验各不相同。1

给定一个 Time 对象(可能是从时间的字符串表示形式计算出来的)你的代码 return 是第二个 Time 对象,等于下一次时间变化发生的时间,从 DST 到 STD,反之亦然(即在美国和加拿大采用 DST 的那些地区)。无需硬连接这些日期。可以这样计算。

require 'time'

def dst_datechange(time)
  year = time.year
  if time.dst?
    start_std(year)
  else
    year += 1 if time >= Time.new(year, 11)
    start_dst(year)
  end
end

def start_std(year)
  date = Date.new(year, 11)
  date += (7-date.wday) % 7
  Time.new(date.year, date.month, date.day, 2)
end

def start_dst(year)
  date = Date.new(year, 3, 8)
  date += (7-date.wday) % 7
  Time.new(date.year, date.month, date.day, 2)
end

['June 17, 2018 1:00pm', 'November 4, 2018 12:59am', 'November 4, 2018 1:00am',      
 'March 10, 2019 1:59am', 'March 10, 2019 2:00am'].
  each do |s|
    t = DateTime.strptime(s, '%B %e, %Y %l:%M%P').to_time
    t = Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec)
    puts "#{s}: #{ dst_datechange(t) }"
  end
  June     17, 2018  1:00pm: 2018-11-04 02:00:00 -0800
  November  4, 2018 12:59am: 2018-11-04 02:00:00 -0800
  November  4, 2018  1:00am: 2019-03-10 03:00:00 -0700
  March    10, 2019  1:59am: 2019-03-10 03:00:00 -0700
  March    10, 2019  2:00am: 2019-11-03 02:00:00 -0800

请注意,第一个、第二个和最后一个示例 return 的时间是 2。这实际上是时间更改后的一个小时。另外两个例子return一个小时3,也就是时间改变后的一瞬间。注:

Time.new(2019, 3, 10, 2)
  #=> 2019-03-10 03:00:00 -0700
Time.parse('March 10, 2019 2:00am')
  #=> 2019-03-10 03:00:00 -0700

将来,DST 日期范围可能会改变(就像他们在 2007 年所做的那样)或者 DST 可能 eliminated altogether. In production code, therefore, it would be prudent to address these possibilities. Assuming the method Time#dst? 将继续存在,Time.new(year,6).dst? 应该告诉我们是否仍然有 DST,如果因此,可以逐日搜索以查看时间何时发生变化。

1. Source