Skip to content

Instantly share code, notes, and snippets.

@dblock
Created June 29, 2012 15:42
Show Gist options
  • Save dblock/3018712 to your computer and use it in GitHub Desktop.
Save dblock/3018712 to your computer and use it in GitHub Desktop.
Date ranges, typically for shows ...
module ActionView
module Helpers
module DateHelper
# returns a date range in English
# July 3-5, both days are the same month
# July 3 - August 5, days are different months
# December 20, 2010 - January 10, 2012, days are over a year apart
def date_range_in_words(start_date, end_date)
# convert to date
start_date = start_date.to_date if start_date && start_date.respond_to?(:to_date)
end_date = end_date.to_date if end_date && end_date.respond_to?(:to_date)
# swap poorly ordered values
start_date, end_date = end_date, start_date if start_date && end_date && end_date < start_date
# different dates
if start_date && end_date && start_date != end_date
# different year, more than one year apart, always include year
# ends next year, but same month or earlier month
if (end_date.year - start_date.year > 1) || (start_date.month <= end_date.month && start_date.year != end_date.year)
"#{start_date.strftime('%B')} #{start_date.day.ordinalize} #{start_date.year} - #{end_date.strftime('%B')} #{end_date.day.ordinalize} #{end_date.year}"
elsif start_date.month != end_date.month
"#{start_date.strftime('%B')} #{start_date.day.ordinalize} - #{end_date.strftime('%B')} #{end_date.day.ordinalize}"
else
"#{start_date.strftime('%B')} #{start_date.day.ordinalize} - #{end_date.day.ordinalize}"
end
# one date
elsif date = (start_date || end_date)
"#{date.strftime('%B')} #{date.day.ordinalize}"
else
""
end
end
end
end
end
require 'spec_helper'
describe ActionView::Helpers::DateHelper do
include ActionView::Helpers::DateHelper
context "date_range_in_words" do
it "nils" do
date_range_in_words(nil, nil).should be_blank
end
it "start only" do
date_range_in_words(Date.new(2001, 2, 3), nil).should == "February 3rd"
end
it "end only" do
date_range_in_words(nil, Date.new(2001, 2, 3)).should == "February 3rd"
end
it "same date" do
dt = Date.new(2001, 2, 3)
date_range_in_words(dt, dt).should == "February 3rd"
end
it "same time" do
dt = Time.new(2001, 2, 3, 4, 5, 6)
date_range_in_words(dt, dt).should == "February 3rd"
end
it "same date but not same time" do
dt1 = Date.new(2001, 2, 3)
dt2 = Time.new(2001, 2, 3, 4, 5, 6)
date_range_in_words(dt1, dt2).should == "February 3rd"
end
it "different days same month" do
dt1 = Date.new(2001, 2, 3)
dt2 = Time.new(2001, 2, 4)
date_range_in_words(dt1, dt2).should == "February 3rd - 4th"
end
it "wrong order" do
dt1 = Date.new(2001, 2, 3)
dt2 = Time.new(2001, 2, 4)
date_range_in_words(dt2, dt1).should == "February 3rd - 4th"
end
it "different months" do
dt1 = Date.new(2001, 2, 3)
dt2 = Time.new(2001, 3, 3)
date_range_in_words(dt1, dt2).should == "February 3rd - March 3rd"
end
it "different years" do
dt1 = Date.new(2001, 12, 29)
dt2 = Time.new(2002, 1, 3)
date_range_in_words(dt1, dt2).should == "December 29th - January 3rd"
end
it "different years but same month" do
dt1 = Date.new(2001, 1, 29)
dt2 = Time.new(2002, 1, 3)
date_range_in_words(dt1, dt2).should == "January 29th 2001 - January 3rd 2002"
end
it "different years two years apart" do
dt1 = Date.new(2001, 1, 29)
dt2 = Time.new(2003, 2, 3)
date_range_in_words(dt1, dt2).should == "January 29th 2001 - February 3rd 2003"
end
it "different non-consecutive years" do
dt1 = Date.new(2001, 12, 29)
dt2 = Time.new(2003, 1, 3)
date_range_in_words(dt1, dt2).should == "December 29th 2001 - January 3rd 2003"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment