How do I add x months to a date

B

Ben Edwards

I have a date

my_date = Date.new( 2007, 1, 1 )

I then have a variable holding an integer

months_to_add = 4

How do i add 'months_to_add' to my_date'?

I have spent ages googeling and looking in o'reilly ruby cookbook but no luck;(

Any ideas?

Ben
 
R

rmagick

I have a date

my_date = Date.new( 2007, 1, 1 )

I then have a variable holding an integer

months_to_add = 4

How do i add 'months_to_add' to my_date'?

I have spent ages googeling and looking in o'reilly ruby cookbook but no luck;(

Any ideas?


My first question is "which 4 months?" Adding January, February,
March, and April is different from adding June, July, and August and
September.

However, let's assume that you know which four and can determine the
number of days in your 4 months. According to ri, Date defines the "+"
method, so it should be as simple as

my_new_date = my_date + days_to_add
 
D

Daniel Lucraft

Ben said:
I have a date

my_date = Date.new( 2007, 1, 1 )

I then have a variable holding an integer

months_to_add = 4

How do i add 'months_to_add' to my_date'?

I have spent ages googeling and looking in o'reilly ruby cookbook but no
luck;(

Any ideas?

Ben

I would do it like this, if I didn't mind loading some helpful
ActiveSupport junk:

irb> require 'active_support/core_ext/numeric'
=> true
irb> require 'active_support/core_ext/date'
=> true

irb> my_date = Date.new( 2007, 1, 1 )
=> #<Date: 4908203/2,0,2299161>

irb> my_time = my_date.to_time
=> Mon Jan 01 00:00:00 +0000 2007

irb> months_to_add = 4
=> 4

irb> new_time = my_time + months_to_add.months
=> Tue May 01 01:00:00 +0100 2007

irb> new_date = Date.new(new_time.year, new_time.month, new_time.day)
=> #<Date: 4908443/2,0,2299161>

best,
Dan
 
B

Ben Edwards

And when I say string you could do better and use a hash or an array.

This all seems like a lot of messing around for what should be a
standard operation. This type of thing must exist in one of the
standard libraries.

Ben
 
D

Daniel Lucraft

Ben said:
This all seems like a lot of messing around for what should be a
standard operation. This type of thing must exist in one of the
standard libraries.

Ben

Actually, you are totally right. The '>>' operator does what is
required:

irb> my_date = Date.new( 2007, 1, 1 )
=> #<Date: 4908203/2,0,2299161>

irb> my_date.to_s
=> "2007-01-01"
irb> (my_date >> 4).to_s
=> "2007-05-01"

best,
Dan
 
P

Phrogz

I have a date

my_date = Date.new( 2007, 1, 1 )

I then have a variable holding an integer

months_to_add = 4

How do i add 'months_to_add' to my_date'?

# http://phrogz.net/RubyLibs/rdoc/files/MutableTime_rb.html

irb(main):001:0> require 'MutableTime'
=> true

irb(main):002:0> my_date = MutableTime.new( 2007, 1, 1 )
=> Thu Feb 01 00:00:00 -0700 2007

irb(main):003:0> my_date.month += 4
=> 5

irb(main):004:0> my_date
=> Fri Jun 01 00:00:00 -0600 2007
 
R

Raimon Fs

Daniel said:
Actually, you are totally right. The '>>' operator does what is
required:

irb> my_date = Date.new( 2007, 1, 1 )
=> #<Date: 4908203/2,0,2299161>

irb> my_date.to_s
=> "2007-01-01"
irb> (my_date >> 4).to_s
=> "2007-05-01"

best,
Dan

I couldn't find any info about this operator >> with dates.

So, for example, if I have 2007-01-01 and I want to know the last day of
adding three months (2007-03-31) I would do:

d = Date.new(2007,1,1)
((d >> 3)-1).to_s

it works, but we can relay on this operations ?


regards,


rai
 
L

Lloyd Linklater

Ben said:
I have a date

my_date = Date.new( 2007, 1, 1 )

I then have a variable holding an integer

months_to_add = 4

How do i add 'months_to_add' to my_date'?

I have spent ages googeling and looking in o'reilly ruby cookbook but no
luck;(

Any ideas?

Ben

I have not tried this but I know of something in rails that sounds
similar:
http://railshelp.com/ActiveSupport::CoreExtensions::Date::Calculations#months_ago

What if you could do something like this:

my_date = Date.new( 2007, 1, 1 )
months_to_add = 4
my_date = my_date.months_ago(months_to_add * -1)

Negative of months_ago could do it.

Shot in the dark but GL!
 
R

Raimon Fs

Lloyd said:
I have not tried this but I know of something in rails that sounds
similar:
http://railshelp.com/ActiveSupport::CoreExtensions::Date::Calculations#months_ago

I wasn't aware of this, thanks !!!

I'm using Rails so I'll try to use it.

I prefer to do in Ruby if it's possible ...

What if you could do something like this:

my_date = Date.new( 2007, 1, 1 )
months_to_add = 4
my_date = my_date.months_ago(months_to_add * -1)

Negative of months_ago could do it.

Shot in the dark but GL!

I'll try it ...

thanks,


rai
 
R

Rick DeNatale

I couldn't find any info about this operator >> with dates.

So, for example, if I have 2007-01-01 and I want to know the last day of
adding three months (2007-03-31) I would do:

d = Date.new(2007,1,1)
((d >> 3)-1).to_s

it works, but we can relay on this operations ?

It's standard Ruby

shadowfax:~/ssanta rick$ qri "Date#<<"
---------------------------------------------------------------- Date#<<
<<(n)
------------------------------------------------------------------------
Return a new Date object that is n months earlier than the current
one.

If the day-of-the-month of the current Date is greater than the
last day of the target month, the day-of-the-month of the returned
Date will be the last day of the target month.

shadowfax:~/ssanta rick$ qri "Date#>>"
---------------------------------------------------------------- Date#>>------------------------------------------------------------------------
Return a new Date object that is n months later than the current
one.

If the day-of-the-month of the current Date is greater than the
last day of the target month, the day-of-the-month of the returned
Date will be the last day of the target month.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top