Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.80 KB | None | 0 0
  1. require "date"
  2. require "fixnum"
  3.  
  4. class DateRangeFormatter
  5.   def initialize(start_date, end_date, start_time = nil, end_time = nil)
  6.     @start_date = Date.parse(start_date)
  7.     @end_date = Date.parse(end_date)
  8.     @start_time = start_time
  9.     @end_time = end_time
  10.   end
  11.  
  12.   def to_s
  13.     return same_date if same_date?
  14.     return same_month if same_month?
  15.     return same_year if same_year?
  16.     all_different
  17.   end
  18.  
  19.   private
  20.  
  21.   def full_end_date
  22.     @end_date.strftime("#{@end_date.day.ordinalize} %B %Y")
  23.   end
  24.  
  25.   def full_start_date
  26.     @start_date.strftime("#{@start_date.day.ordinalize} %B %Y")
  27.   end
  28.  
  29.   def same_date?
  30.     @start_date == @end_date
  31.   end
  32.  
  33.   def same_month?
  34.     @start_date.month == @end_date.month
  35.   end
  36.  
  37.   def same_year?
  38.     @start_date.year == @end_date.year
  39.   end
  40.  
  41.   def same_date
  42.     if @start_time && @end_time
  43.       "#{full_start_date} at #{@start_time} to #{@end_time}"
  44.     elsif @start_time
  45.       "#{full_start_date} at #{@start_time}"
  46.     elsif @end_time
  47.       "#{full_start_date} until #{@end_time}"
  48.     else
  49.       full_start_date
  50.     end
  51.   end
  52.  
  53.   def same_month
  54.     return format_with_time { @start_date.strftime("#{@start_date.day.ordinalize} - #{@end_date.day.ordinalize} %B %Y") } if same_year?
  55.     all_different
  56.   end
  57.  
  58.   def same_year
  59.     format_with_time { @start_date.strftime("#{@start_date.day.ordinalize} %B - ") + full_end_date }
  60.   end
  61.  
  62.   def all_different
  63.     format_with_time { "#{full_start_date} - #{full_end_date}" }
  64.   end
  65.  
  66.   def format_with_time
  67.     if @start_time || @end_time
  68.       format_datetime(full_start_date, @start_time) + ' - ' + format_datetime(full_end_date, @end_time)
  69.     else
  70.       yield
  71.     end
  72.   end
  73.  
  74.   def format_datetime(date, time = nil)
  75.     return "#{date} at #{time}" if time
  76.     date
  77.   end
  78. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement