Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从ruby中使用月份或年份创建的时间/日期对象中获取开始日期和结束日期?_Ruby_Date_Time - Fatal编程技术网

如何从ruby中使用月份或年份创建的时间/日期对象中获取开始日期和结束日期?

如何从ruby中使用月份或年份创建的时间/日期对象中获取开始日期和结束日期?,ruby,date,time,Ruby,Date,Time,我有符合ISO 8601的日期字符串,如“2016”或“2016-09”,表示年份或月份。如何从中获取开始和结束日期 例如: 2016 -> ["2016-01-01", "2016-12-31"] 2016-09 -> ["2016-09-01", "2016-09-30"] 谢谢试试这个 require 'date' def create_start_end(string) year, month = string.split('-').map(&:to_i

我有符合ISO 8601的日期字符串,如“2016”或“2016-09”,表示年份或月份。如何从中获取开始和结束日期

例如:

2016    -> ["2016-01-01", "2016-12-31"]
2016-09 -> ["2016-09-01", "2016-09-30"]
谢谢

试试这个

require 'date'

def create_start_end(string)
  year, month = string.split('-').map(&:to_i)
  if month && !month.zero?
    [Date.new(year, month, 1).to_s, Date.new(year, month, -1).to_s]
  else
    [Date.new(year, 1, 1).to_s, Date.new(year, 12, -1).to_s]
  end
end

create_start_end('2016')
#=> ["2016-01-01", "2016-12-31"]
create_start_end('2016-01')
#=> ["2016-01-01", "2016-01-31"]
create_start_end('2016-09')
#=> ["2016-09-01", "2016-09-30"]
require 'date'

def iso8601_range(str)
  parts = str.scan(/\d+/).map(&:to_i)
  date = Date.new(*parts)
  case parts.size
  when 1
    date .. date.next_year - 1
  when 2
    date .. date.next_month - 1
  else
    date .. date
  end

end

iso8601_range('2016') # => 2016-01-01..2016-12-31
iso8601_range('2016-09') # => 2016-09-01..2016-09-30
iso8601_range('2016-09-20') # => 2016-09-20..2016-09-20

如果您对使用
send
不感兴趣,可以将
case
语句替换为

date .. date.send([:next_year,:next_month,:next_day][parts.size - 1]) - 1

根据@AndreyDeineko:)中的另一个解决方案


已编辑,谢谢评论(不确定是否是您留下并删除了评论)。另外,关于Rails的工作太多了:)谢谢@akuhn看起来不错。我想知道是否有任何内在的方式或宝石来实现同样的目标。似乎是一个常见的与时间相关的问题。实际上,对于日期为iso8601_范围(“2016-08-31”)的边界条件,这将失败。好的捕获!哦,开枪吧,它在2016-12年也会失败。(修复,下一年使用
/
下个月使用
现在。谢谢@AndreyDeineko。很好。嘿!@AndreyDeineko,你觉得怎么样?:)
require 'date'

def create_date date
  date = date.split('-').map(&:to_i)
  [Date.new(*date, 1, 1), Date.new(*date, -1, -1)].map(&:to_s)
end