我正在尝试从我创建的方法中减去 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
我已经成功创建了一个名为 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