Created
June 29, 2012 15:42
-
-
Save dblock/3018712 to your computer and use it in GitHub Desktop.
Date ranges, typically for shows ...
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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