85

How do I create a Ruby date object from the following string?

DD-MM-YYYY

7 Answers 7

158
Date.parse('31-12-2010')

Alternatively Date#strptime(str, format).

Sign up to request clarification or add additional context in comments.

Comments

42

Because in the USA they get the dates backwards, it's important not to simply use Date.parse() because you'll find 9/11/2001 can be 11 September 2001 in the USA and 9 November 2001 in the rest of the world. To be completely unambiguous use Date::strptime(your_date_string,"%d-%m-%Y") to correctly parse a date string of format dd-mm-yyyy.

Try this to be sure:

>irb
>> require 'date'
=> true
>> testdate = '11-09-2001'
=> "11-09-2001"
>> converted = Date::strptime(testdate, "%d-%m-%Y")
=> #<Date: 4918207/2,0,2299161>
>> converted.mday
=> 11
>> converted.month
=> 9
>> converted.year
=> 2001

For other strptime formats see http://pubs.opengroup.org/onlinepubs/009695399/functions/strptime.html

Also I always make sure I set my base timezone to :utc if my website is going to be handling any dates, and use Javascript on the client side to display local times.

1 Comment

what, if any, is the difference between .mday and .day?
21

You can use Time#parse.

Time.parse("20-08-2010")
# => Fri Aug 20 00:00:00 +0200 2010

However, because Ruby could parse the date as "MM-DD-YYYY", the best way is to go with DateTime#strptime where you can specify the input format.

Comments

5

If you have control over the format of the date in the string, then Date.parse works fine internationally with strings in YYYY-MM-DD (ISO 8601) format:

Date.parse('2019-11-20')

Comments

2

I find this approach simpler since it avoid having to specify the date format for the parser:

date1 = Time.local(2012, 1, 20, 12, 0, 0).to_date

Comments

1

Like this You can get time Object from a string like this:

t = Time.parse "9:00 PM" 
 => 2013-12-24 21:00:00 +0530

t = Time.parse "12:00 AM"
 => 2013-12-24 00:00:00 +0530 

But Ruby parsing this as a Date!

So you can use the column as a string.

add_column :table_name, :from, :string, :limit => 8, :default => "00:00 AM", :null => false
add_column :table_name, :to, :string, :limit => 8, :default => "00:00 AM", :null => false 

And you can assign string object to the attribute,

r.from = "05:30 PM"
r.save

And parse the string for getting time object,

Time.zone.parse("02:00 PM")

Comments

0

Not necessary for this particular string format, but best string to time parsing utility I know is Chronic which is available as a gem and works for about 99.9% of usecases for human formatted dates/times.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.