Class: Date

Inherits:
Object show all
Defined in:
lib/standard/facets/date.rb,
lib/standard/facets/date/cmp.rb

Overview

Date

This new version of Date extension has been largely improved by porting some of the methods used by ActiveSupport. The old version already had much in common with the Active Support library, so it was decided to take it a step further in that direction for the sake of interoparability.

Hopefully most of these methods will find there way into Ruby's own standard library eventually.

The biggest difference with ActiveSupport is the lack of many of the “English-esque” methods, and that we use #stamp with Date::FORMAT, instead of #to_formmated_s with Date::DATE_FORMATS. We do not override the standard #to_s method like ActiveSupport does.

Constant Summary collapse

FORMAT =
{
  :short        => "%e %b",
  :long         => "%B %e, %Y",
  :db           => "%Y-%m-%d",
  :number       => "%Y%m%d",
  :rfc822       => "%e %b %Y",
  :default      => "%Y-%m-%d",
  nil           => "%Y-%m-%d"
}

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.currentObject

Returns Time.zone.today when config.time_zone is set, otherwise just returns Date.today.


44
45
46
# File 'lib/standard/facets/date.rb', line 44

def self.current
  ::Time.zone_default ? ::Time.zone.today : ::Date.today
end

.tomorrowObject

Returns a new Date representing the date 1 day after today (i.e. tomorrow's date).


39
40
41
# File 'lib/standard/facets/date.rb', line 39

def self.tomorrow
  ::Date.today.tomorrow
end

.yesterdayObject

Returns a new Date representing the date 1 day ago (i.e. yesterday's date).


34
35
36
# File 'lib/standard/facets/date.rb', line 34

def self.yesterday
  ::Date.today.yesterday
end

Instance Method Details

#<=>(other) ⇒ Object

Allow for Date <=> DateTime <=> Time, to work as expected.


25
26
27
28
29
30
31
# File 'lib/standard/facets/date/cmp.rb', line 25

def <=>(other)
	if Time === other
		self.to_datetime <=> other.to_datetime
	else
		old_compare(other)
	end
end

#advance(options) ⇒ Object

Provides precise Date calculations for years, months, and days. The options parameter takes a hash with any of these keys: :years, :months, :weeks, :days.


138
139
140
141
142
143
144
145
# File 'lib/standard/facets/date.rb', line 138

def advance(options)
  d = self
  d = d >> options.delete(:years) * 12 if options[:years]
  d = d >> options.delete(:months)     if options[:months]
  d = d +  options.delete(:weeks) * 7  if options[:weeks]
  d = d +  options.delete(:days)       if options[:days]
  d
end

#ago(seconds) ⇒ Object

Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00) and then subtracts the specified number of seconds


164
165
166
# File 'lib/standard/facets/date.rb', line 164

def ago(seconds)
  to_time.since(-seconds)
end

#beginning_of_dayObject Also known as: midnight

Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00).


178
179
180
# File 'lib/standard/facets/date.rb', line 178

def beginning_of_day
  to_time
end

#change(options) ⇒ Object

Returns a new Date where one or more of the elements have been changed according to the options parameter.

Date.new(2007, 5, 12).change(:day=>1)                 # Date.new(2007, 5, 1)
Date.new(2007, 5, 12).change(:year=>2005, :month=>1)  # Date.new(2005, 1, 12)

153
154
155
156
157
158
159
# File 'lib/standard/facets/date.rb', line 153

def change(options)
  ::Date.new(
    options[:year]  || self.year,
    options[:month] || self.month,
    options[:day]   || self.day
  )
end

#days_in_monthObject

Returns the number of days in the date's month.

Date.new(2004,2).days_in_month  #=> 29

CREDIT: Ken Kunz.


89
90
91
# File 'lib/standard/facets/date.rb', line 89

def days_in_month
   Date.civil(year, month, -1).day
end

#days_of_monthObject


93
94
95
# File 'lib/standard/facets/date.rb', line 93

def days_of_month
  (1..days_in_month).to_a
end

#month_nameObject

Get the month name for this date object

CREDIT: Benjamin Oakes


100
101
102
# File 'lib/standard/facets/date.rb', line 100

def month_name
  MONTHNAMES[self.month]
end

#old_compareObject (private)


20
# File 'lib/standard/facets/date/cmp.rb', line 20

alias_method :old_compare, :<=>

#since(seconds) ⇒ Object Also known as: in

Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00) and then adds the specified number of seconds.


171
172
173
# File 'lib/standard/facets/date.rb', line 171

def since(seconds)
  to_time.since(seconds)
end

#stamp(format = :default) ⇒ Object

Convert to a formatted string. See DATE_FORMATS for predefined formats.

This method is aliased to to_s.

date = Date.new(2007, 11, 10)   # Sat, 10 Nov 2007

date.stamp(:db)                 # => "2007-11-10"
date.stamp(:short)              # => "10 Nov"
date.stamp(:long)               # => "November 10, 2007"
date.stamp(:rfc822)             # => "10 Nov 2007"

Adding your own formats to stamp

You can add your own formats to the Date::FORMAT hash. Use the format name as the hash key and a strftime string as the value. Eg.

Date::FORMAT[:month_and_year] = "%B %Y"

122
123
124
125
126
127
128
# File 'lib/standard/facets/date.rb', line 122

def stamp(format=:default)
  if formatter = FORMAT[format]
    strftime(formatter)
  else
    to_s
  end
end

#to_dateObject

A method to keep Time, Date and DateTime instances interchangeable on conversions. In this case, it simply returns self.


50
51
52
# File 'lib/standard/facets/date.rb', line 50

def to_date
  self
end

#to_datetimeObject

Converts a Date instance to a DateTime, where the time is set to the beginning of the day and UTC offset is set to 0.

date = Date.new(2007, 11, 10)  # Sat, 10 Nov 2007
date.to_datetime               # Sat, 10 Nov 2007 00:00:00 0000

60
61
62
# File 'lib/standard/facets/date.rb', line 60

def to_datetime
  ::DateTime.civil(year, month, day, 0, 0, 0, 0)
end

#to_time(form = :local) ⇒ Object

Converts a Date instance to a Time, where the time is set to the beginning of the day. The timezone can be either :local or :utc (default :local).

date = Date.new(2007, 11, 10)  # Sat, 10 Nov 2007

date.to_time                   # Sat Nov 10 00:00:00 0800 2007
date.to_time(:local)           # Sat Nov 10 00:00:00 0800 2007

date.to_time(:utc)             # Sat Nov 10 00:00:00 UTC 2007

74
75
76
77
# File 'lib/standard/facets/date.rb', line 74

def to_time(form=:local)
  ::Time.send(form, year, month, day)
  ##::Time.send("#{form}_time", year, month, day)
end

#tomorrowObject

Convenience method which returns a new Date/DateTime representing the time 1 day since the instance time.


191
192
193
# File 'lib/standard/facets/date.rb', line 191

def tomorrow
  self + 1
end

#xmlschemaObject


80
81
82
# File 'lib/standard/facets/date.rb', line 80

def xmlschema
  to_time.xmlschema
end

#yesterdayObject

Convenience method which returns a new Date/DateTime representing the time 1 day ago.


185
186
187
# File 'lib/standard/facets/date.rb', line 185

def yesterday
  self - 1
end