How do I add x months to a date

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

···

--
Ben Edwards - Bristol, UK
If you have a problem emailing me use
http://www.gurtlush.org.uk/profiles.php?uid=4
(email address this email is sent from may be defunct)

You can't do it directly, date objects are immutable.

You could always get the date value from the object and then parse it, add
the number of months you want and then create a new date object. That seems
like a bit of a waste though. I would keep the date value in a string and
manipulate it there, if and when I needed an actual date object with that
value I would create a date object and give that out.

···

On 7/3/07, Ben Edwards <funkytwig@gmail.com> wrote:

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
--
Ben Edwards - Bristol, UK
If you have a problem emailing me use
http://www.gurtlush.org.uk/profiles.php?uid=4
(email address this email is sent from may be defunct)

--
"Hey brother christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

Ben Edwards wrote:

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:

require 'active_support/core_ext/numeric'

=> true

require 'active_support/core_ext/date'

=> true

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

=> #<Date: 4908203/2,0,2299161>

my_time = my_date.to_time

=> Mon Jan 01 00:00:00 +0000 2007

months_to_add = 4

=> 4

new_time = my_time + months_to_add.months

=> Tue May 01 01:00:00 +0100 2007

new_date = Date.new(new_time.year, new_time.month, new_time.day)

=> #<Date: 4908443/2,0,2299161>

best,
Dan

···

--
Posted via http://www.ruby-forum.com/\.

Ben Edwards wrote:

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:

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!

···

--
Posted via http://www.ruby-forum.com/\.

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

···

On 7/3/07, Glen Holcomb <damnbigman@gmail.com> wrote:

You can't do it directly, date objects are immutable.

You could always get the date value from the object and then parse it, add
the number of months you want and then create a new date object. That
seems
like a bit of a waste though. I would keep the date value in a string and
manipulate it there, if and when I needed an actual date object with that
value I would create a date object and give that out.

On 7/3/07, Ben Edwards <funkytwig@gmail.com> wrote:
>
> 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
> --
> Ben Edwards - Bristol, UK
> If you have a problem emailing me use
> http://www.gurtlush.org.uk/profiles.php?uid=4
> (email address this email is sent from may be defunct)
>

--
"Hey brother christian with your high and mighty errand, Your actions
speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

--
"Hey brother christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

Lloyd Linklater wrote:

Ben Edwards wrote:

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:
Klu.ai Documentation

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

···

--
Posted via http://www.ruby-forum.com/\.

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

>
> You can't do it directly, date objects are immutable.
>
> You could always get the date value from the object and then parse it, add
> the number of months you want and then create a new date object. That
> seems
> like a bit of a waste though. I would keep the date value in a string and
> manipulate it there, if and when I needed an actual date object with that
> value I would create a date object and give that out.

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

···

On 03/07/07, Glen Holcomb <damnbigman@gmail.com> wrote:

On 7/3/07, Glen Holcomb <damnbigman@gmail.com> wrote:

> On 7/3/07, Ben Edwards <funkytwig@gmail.com> wrote:
> >
> > 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
> > --
> > Ben Edwards - Bristol, UK
> > If you have a problem emailing me use
> > http://www.gurtlush.org.uk/profiles.php?uid=4
> > (email address this email is sent from may be defunct)
> >
>
> --
> "Hey brother christian with your high and mighty errand, Your actions
> speak
> so loud, I can't hear a word you're saying."
>
> -Greg Graffin (Bad Religion)
>

--
"Hey brother christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

--
Ben Edwards - Bristol, UK
If you have a problem emailing me use
http://www.gurtlush.org.uk/profiles.php?uid=4
(email address this email is sent from may be defunct)

Ben Edwards wrote:

> manipulate it there, if and when I needed an actual date object with that
> value I would create a date object and give that out.

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:

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

=> #<Date: 4908203/2,0,2299161>

my_date.to_s

=> "2007-01-01"

(my_date >> 4).to_s

=> "2007-05-01"

best,
Dan

···

On 03/07/07, Glen Holcomb <damnbigman@gmail.com> wrote:

--
Posted via http://www.ruby-forum.com/\.

Daniel Lucraft wrote:

Ben Edwards wrote:

> manipulate it there, if and when I needed an actual date object with that
> value I would create a date object and give that out.

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:

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

> my_date.to_s
=> "2007-01-01"
> (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

···

On 03/07/07, Glen Holcomb <damnbigman@gmail.com> wrote:

--
Posted via http://www.ruby-forum.com/\.

It's standard Ruby

shadowfax:~/ssanta rick$ qri "Date#<<"
---------------------------------------------------------------- Date#<<
     <<(n)

···

On 12/7/07, Raimon Fs <coder@montx.com> wrote:

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 ?

------------------------------------------------------------------------
     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#>>
     >>(n)
------------------------------------------------------------------------
     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.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/