如何从ruby中使用月份或年份创建的时间/日期对象中获取开始日期和结束日期?
我有符合ISO 8601的日期字符串,如“2016”或“2016-09”,表示年份或月份。如何从中获取开始和结束日期 例如:如何从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
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