Ruby 如何更改时间对象的月份?

Ruby 如何更改时间对象的月份?,ruby,time,Ruby,Time,我有两个时间对象,一个对象的月份更大: t = Time.new(2017, 8, 1) n = Time.new(2017, 9, 1) 如何仅使用一个输入设置两个对象的月份 我认为这样做会奏效: month1 = gets #This works month2 = month1 + 1 t = Time.new(2017, month1, 1) #This works too n = Time.new(2017, month2, 1) #But this doesn't wo

我有两个时间对象,一个对象的月份更大:

t = Time.new(2017, 8, 1)
n = Time.new(2017, 9, 1)
如何仅使用一个输入设置两个对象的月份

我认为这样做会奏效:

month1 = gets   #This works
month2 = month1 + 1

t = Time.new(2017, month1, 1)   #This works too
n = Time.new(2017, month2, 1)   #But this doesn't work

我需要做的唯一一件事是将读入的字符串转换为整数:

month1 = gets.to_i
然后我的代码运行得很好

> month1 = gets.to_i
> 5
> month2 = month1 + 1
> t = Time.new(2017, month1, 1)
#=> 2017-05-01 00:00:00 +0530 
> n = Time.new(2017, month2, 1)
#=> 2017-06-01 00:00:00 +0530 
注意:

  • 您只需要将用户的输入转换为整数
  • 在代码
    month2=month1+1
    中,month1是
    String
    ,您正在添加一个整数值,这会给您带来一个错误

在Rails中: 如果您使用的是rails,那么内置方法是可用的,您可以使用以下任意键更改任何参数:
:year
:month
:day
:hour
:min
:sec
:usec:nsec

例如:

> Time.new(2017, 8, 1)
#=> 2017-08-01 00:00:00 +0530 
> Time.new(2017, 8, 1).change(month: 7)
#=> 2017-07-01 00:00:00 +0530 

既然您的问题显然以任何方式忽略了对象的时间部分,您的解决方案将必须处理值不在1和11之间的情况,否则将针对超出范围的月份引发错误,那么这又如何呢

require 'date'
loop do 
    puts "Enter the first month:"
    @first_month = gets.to_i
    if (1..12).include?(@first_month)
      break
    else
      puts "Incorrect value a month must be between 1 and 12."
      puts "Please Try Again."
    end
end

t = Date.new(2017,@first_month,1)
n = t >> 1
这将使用
Date#>
,它只返回一个新的
Date
对象,该对象的增量为n个月。比如说

d = Date.new(2017,11,1)
d >> 1
#=> #<Date: 2017-12-01 ((2458089j,0s,0n),+0s,2299161j)> 
d >> 2
#=> #<Date: 2018-01-01 ((2458120j,0s,0n),+0s,2299161j)>
# It can accept negative numbers too 
# Although this is usually represented as d << 10
d >> -10
#=> #<Date: 2017-01-01 ((2457755j,0s,0n),+0s,2299161j)>
d >> -10 == d << 10
#=> true
d=新日期(2017,11,1)
d>>1
#=> # 
d>>2
#=> #
#它也可以接受负数
#虽然这通常表示为d>-10
#=> #
d>>-10==d真

如果这是您的代码,它应该在
t=Time.new(2017,month1,1)之前崩溃。
提示:您不能在字符串中添加数字。不,它不能。将该代码放入一个文件并运行该文件。@Sergio Tulentsev但我不明白,我认为我没有使用Time.new创建字符串对象。哦,好吧,我知道我失败的地方。我读入了一个字符串,需要将其转换为整数。@Alassar:不,它在
month2=month1+1
处完全失败。