Useful Constants in Ruby's Date Class

While tying to modify dates in string form, I came across a convenient way to convert months into their numerical values. For example, say I had the string Aug 20, 2020 and I wanted to convert it into 8-20-2020. It’s easy to split the string and add a dash in between each number. But what about Aug? How do we get the numerical form of Aug and all the other months? We could manually create something like a hash that contains months in string and numerical form. But, Ruby already comes with a built-in solution.

In the documentation, I discovered that Ruby’s Date class comes with two array constants that can help in this situation. Those constants are MONTHNAMES and ABBR_MONTHNAMES.

MONTHNAMES is an array of the full names of all the months.

# irb

> require 'date'

=> true

> Date::MONTHNAMES

=> [nil, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

ABBR_MONTHNAMES is an array of abbreviated month names.

# irb

> require 'date'

=> true

> Date::ABBR_MONTHNAMES

=> [nil, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

In my situation, ABBR_MONTHNAMES will solve my problem since the data I’m parsing contains abbreviated month names. Now, when parsing Aug 20, 2020, I can run the following to get a numerical value for Aug:

# irb

> require 'date'

=> true

Date::ABBR_MONTHNAMES.index('Aug')

=> 8

No need to create a hash or array myself, this constant gets the job done.

I noticed both arrays have nil as their first value. At first I asked “why?”, but it quickly became clear that the nil values are simply filler to take up index 0 since there is no month with this numerical value.

This was a nice discovery. Ruby continues to make writing code a pleasant experience.