Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require "date"
- require "fixnum"
- class DateRangeFormatter
- def initialize(start_date, end_date, start_time = nil, end_time = nil)
- @start_date = Date.parse(start_date)
- @end_date = Date.parse(end_date)
- @start_time = start_time
- @end_time = end_time
- end
- def to_s
- return same_date if same_date?
- return same_month if same_month?
- return same_year if same_year?
- all_different
- end
- private
- def full_end_date
- @end_date.strftime("#{@end_date.day.ordinalize} %B %Y")
- end
- def full_start_date
- @start_date.strftime("#{@start_date.day.ordinalize} %B %Y")
- end
- def same_date?
- @start_date == @end_date
- end
- def same_month?
- @start_date.month == @end_date.month
- end
- def same_year?
- @start_date.year == @end_date.year
- end
- def same_date
- if @start_time && @end_time
- "#{full_start_date} at #{@start_time} to #{@end_time}"
- elsif @start_time
- "#{full_start_date} at #{@start_time}"
- elsif @end_time
- "#{full_start_date} until #{@end_time}"
- else
- full_start_date
- end
- end
- def same_month
- return format_with_time { @start_date.strftime("#{@start_date.day.ordinalize} - #{@end_date.day.ordinalize} %B %Y") } if same_year?
- all_different
- end
- def same_year
- format_with_time { @start_date.strftime("#{@start_date.day.ordinalize} %B - ") + full_end_date }
- end
- def all_different
- format_with_time { "#{full_start_date} - #{full_end_date}" }
- end
- def format_with_time
- if @start_time || @end_time
- format_datetime(full_start_date, @start_time) + ' - ' + format_datetime(full_end_date, @end_time)
- else
- yield
- end
- end
- def format_datetime(date, time = nil)
- return "#{date} at #{time}" if time
- date
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement