DateTime
In Ruby consider the DateTime
class
. It fetches the current date and relative dates. We use operators to adjust days and months, and we can even check for leap years.
By using methods like DateTime.now
, we can get the current time. Meanwhile, properties like month, year, and day can reveal date info.
This Ruby program gets the current date with DateTime.now
. It also shows how to access the month, day and year parts of the DateTime
.
require "date" # Get current date. current = DateTime.now # Print current month, day and year. print "Month: ", current.month, "\n" print " Day: ", current.day, "\n" print " Year: ", current.year, "\n"Month: 2 Day: 21 Year: 2017
We can add or subtract an integer from a Date
. Subtracting one yields the previous day, and adding one moves to the next day. In this way, we compute yesterday and tomorrow.
require "date" # First day of 2014. d = Date.new(2014, 1, 1) # Subtract one day to get the last day of 2013. subtract = d - 1 # Add one day to get the next day. add = d + 1 # Display values. puts subtract puts d puts add2013-12-31 2014-01-01 2014-01-02
We create arbitrary times with the Time.gm
and Time.local
methods. Time.gm
returns a UTC time. Time.local
returns a time adjusted for your local time zone.
Time.gm
to increase the accuracy of your time. Here I pass 6.# Create a UTC time for the specified values. t = Time.gm(2013, "mar", 15) puts t # Create time with local time zone. t = Time.local(2010, "apr", 10) puts t # More arguments can be passed. t = Time.gm(2012, "jun", 30, 6, 30, 30, 50) puts t2013-03-15 00:00:00 UTC 2010-04-10 00:00:00 -0700 2012-06-30 06:30:30 UTC
This method tells us if a year is a leap year or not. Leap years have an extra day. We must first create a Date
object with the Date.new
initialize method.
require "date" def days_in_year(year) d = Date.new(year, 1, 1) # See if the year is a leap year. if d.leap? return 366 else return 365 end end # Test years for leap status. 2000.upto(2010) do |year| puts year.to_s << " has " << days_in_year(year).to_s << " days" end2000 has 366 days 2001 has 365 days 2002 has 365 days 2003 has 365 days 2004 has 366 days 2005 has 365 days 2006 has 365 days 2007 has 365 days 2008 has 366 days 2009 has 365 days 2010 has 365 days
Dates have helpful iterators. In Ruby we often prefer iterators over loops. For upto, the initial date is incremented upwards, a day at a time. And downto decrements the day.
require "date" d1 = Date.new(2014, 10, 5) d2 = Date.new(2014, 10, 7) puts "upto" # Iterate from low to high date. d1.upto(d2) do |d| puts d end puts "downto" # Iterate from high to low date. d2.downto(d1) do |d| puts d endupto 2014-10-05 2014-10-06 2014-10-07 downto 2014-10-07 2014-10-06 2014-10-05
This iterator is more flexible than upto or downto. We specify the "increment" or decrement value. So a step of 7 advances an entire week on each iteration.
require "date" first = Date.new(2014, 10, 1) last = Date.new(2014, 11, 1) # Advance seven days each iteration (these are Wednesdays). first.step(last, 7) do |d| puts d end2014-10-01 2014-10-08 2014-10-15 2014-10-22 2014-10-29
The next and succ methods return the successive date—the "tomorrow" date. To me, the next()
method is more clearly named. In this program, I specify the end date of October.
require "date" d = Date.new(2014, 10, 31) # Get the next date with succ or next. d2 = d.succ puts d2 d2 = d.next puts d22014-11-01 2014-11-01
We use shift operators with two greater than (or less than) signs to add (or subtract) months. This changes the month in a date. The plus and minus are used for days.
require "date" d = Date.new(2015, 5, 1) # Add two months to the date. d2 = d >> 2 puts d2 # Subtract three months from the date. d3 = d << 3 puts d32015-07-01 2015-02-01
This number indicates the "day of week" or weekday of a date. It returns the numbers 0 through 6, with 0 meaning Sunday and 6 meaning Saturday.
require "date" # This is a Sunday, so its number is 0. d = Date.new(2014, 10, 5) puts d.wday # Next day is a Monday (number 1). d = d.next puts d.wday # Tuesday (number 2). d = d.next puts d.wday # One week later is Tuesday again. d += 7 puts d.wday0 1 2 2
With DateTime
in Ruby, we access many date functions. These would be hard to implement. It is typically best to reuse these library methods where possible.