keyongtech


  keyongtech > ruby > 03/2008

 #1  
02-27-08, 04:17 PM
Shandy Nantz
This is probably an easy question but I am trying to get at the number
of days that are in a month. I have this calendar that I have built, the
idea being that when a month turns from February to March, for example,
the calendar should redisplay itself properly formated showing the new
month and the correct number of days. I have it so that it starts
counting the days on the right day of the week, but I have to know when
to stop counting. Any ideas, Thanks,

-S
 #2  
02-27-08, 04:40 PM
Gregory Seidman
On Thu, Feb 28, 2008 at 01:17:22AM +0900, Shandy Nantz wrote:
> This is probably an easy question but I am trying to get at the number
> of days that are in a month. I have this calendar that I have built, the
> idea being that when a month turns from February to March, for example,
> the calendar should redisplay itself properly formated showing the new
> month and the correct number of days. I have it so that it starts
> counting the days on the right day of the week, but I have to know when
> to stop counting. Any ideas, Thanks,


require 'date'

def days_in_month(month, year)
month = month.to_i
year = year.to_i
raise ArgumentError.new("invalid month") unless (1..12).to_a.include? month
first = Date.parse sprintf("%04d%02d01", year, month)
next_month = first + 32
(last - last.mday).mday
end
 #3  
02-27-08, 04:55 PM
Thomas Preymesser
On 27/02/2008, Shandy Nantz <shandybleu> wrote:
>
> This is probably an easy question but I am trying to get at the number
> of days that are in a month. I have this calendar that I have built, the
> idea being that when a month turns from February to March, for example,
> the calendar should redisplay itself properly formated showing the new
> month and the correct number of days. I have it so that it starts
> counting the days on the right day of the week, but I have to know when
> to stop counting. Any ideas, Thanks,



i have not completely understood your problem, but there is a gem call
'date_utils' which does various calendar calculations.

See http://thopre.wordpress.com/2007/06/...e-week-200724/ for
some examples!

-Thomas

--=20
Thomas Preymesser
thopre
thomas
B=FCro: 030 - 830 353 88
mobil: 0176 - 75 03 03 04
Privat: 030 - 49 78 37 06
http://thopre.wordpress.com/
http://www.thopre.com/
 #4  
02-27-08, 05:07 PM
Morton Goldberg
On Feb 27, 2008, at 11:17 AM, Shandy Nantz wrote:

> This is probably an easy question but I am trying to get at the number
> of days that are in a month. I have this calendar that I have
> built, the
> idea being that when a month turns from February to March, for
> example,
> the calendar should redisplay itself properly formated showing the new
> month and the correct number of days. I have it so that it starts
> counting the days on the right day of the week, but I have to know
> when
> to stop counting. Any ideas, Thanks,


<code>
require "Date"
d = Date.new(2008, 2, -1)
d.day # => 29
</code>

You can find the last day of a month by creating a Date object for
day -1.

Regards, Morton
 #5  
02-27-08, 05:47 PM
Brian Adkins
On Feb 27, 11:40 am, Gregory Seidman <gsslist+r>
wrote:
> On Thu, Feb 28, 2008 at 01:17:22AM +0900, Shandy Nantz wrote:
>
> require 'date'
>
> def days_in_month(month, year)
> month = month.to_i
> year = year.to_i
> raise ArgumentError.new("invalid month") unless (1..12).to_a.include? month
> first = Date.parse sprintf("%04d%02d01", year, month)
> next_month = first + 32
> (last - last.mday).mday
> end
>> --Greg


might want to try running that before posting
 #6  
02-27-08, 06:00 PM
Gregory Seidman
On Thu, Feb 28, 2008 at 02:49:54AM +0900, Brian Adkins wrote:
> On Feb 27, 11:40 am, Gregory Seidman <gsslist+r>
> wrote:
>
> might want to try running that before posting


Ah, details. Change the last line of the method to:

(next_month + next_month.mday).mday

Anyhow, it's worth noting that ActiveSupport includes Time.days_in_month.

--Greg
 #7  
02-27-08, 06:11 PM
Brian Adkins
On Feb 27, 11:17 am, Shandy Nantz <shandyb> wrote:
> This is probably an easy question but I am trying to get at the number
> of days that are in a month. I have this calendar that I have built, the
> idea being that when a month turns from February to March, for example,
> the calendar should redisplay itself properly formated showing the new
> month and the correct number of days. I have it so that it starts
> counting the days on the right day of the week, but I have to know when
> to stop counting. Any ideas, Thanks,


require 'date'

def days_in_month year, month
((month < 12) ?
Date.new(year, month + 1) :
Date.new(year + 1, 1)).-(1).mday
end

puts days_in_month(2008,2) # => 29
 #8  
02-27-08, 06:15 PM
Brian Adkins
On Feb 27, 12:07 pm, Morton Goldberg <m_goldb> wrote:
> On Feb 27, 2008, at 11:17 AM, Shandy Nantz wrote:
>> <code>

> require "Date"
> d = Date.new(2008, 2, -1)
> d.day # => 29
> </code>
>
> You can find the last day of a month by creating a Date object for
> day -1.
>
> Regards, Morton


And we have a winner :)

I wish I had read your post before posting mine. I need to read the
stdlib doc more carefully.
 #9  
02-27-08, 06:26 PM
Brian Adkins
On Feb 27, 1:00 pm, Gregory Seidman <gsslist+r>
wrote:
> On Thu, Feb 28, 2008 at 02:49:54AM +0900, Brian Adkins wrote:
>>
>> Ah, details. Change the last line of the method to:

>
> (next_month + next_month.mday).mday
>
> Anyhow, it's worth noting that ActiveSupport includes Time.days_in_month.
>
> --Greg


You still didn't run it, did you? <sigh>

Some ideas you may want to consider:
1) it's probably reasonable to expect numeric month and day arguments,
so you can skip the .to_i calls
2) instead of creating a range, converting it to an array and calling
include?, wouldn't it be better to just use a simple comparison such
as "unless month > 0 && month < 13
3) sprintf'ing a date just to parse it is unnecessary & inefficient
4) it's still broken
 #10  
02-27-08, 07:17 PM
Gregory Seidman
On Thu, Feb 28, 2008 at 03:29:54AM +0900, Brian Adkins wrote:
> On Feb 27, 1:00 pm, Gregory Seidman <gsslist+r>
> wrote:
>
> You still didn't run it, did you? <sigh>


Don't sigh at me. I wrote some code off the cuff and fired it off. I also
didn't include unit tests. Yes, it was buggy and inefficient, but it got
across the approach I was using.

> Some ideas you may want to consider:
> 1) it's probably reasonable to expect numeric month and day arguments,
> so you can skip the .to_i calls


Given that it was for clarity, I think it's valuable.

> 2) instead of creating a range, converting it to an array and calling
> include?, wouldn't it be better to just use a simple comparison such
> as "unless month > 0 && month < 13


Arguable. I prefer range inclusion to a pair of comparisons, but that's a
matter of taste. The to_a only matters if I hadn't performed a to_i on the
month argument previously.

> 3) sprintf'ing a date just to parse it is unnecessary & inefficient


True enough. Date.new (a.k.a. Date.civil) takes year, month, and day
arguments. For that matter, as pointed out elsewhere in this thread, a -1
for the day argument gives the last day of the month, making the rest of
the method moot.

> 4) it's still broken


Typo. The + should have been a - in the correction. The correct, if
unnecessary, method is:

require 'date'

def days_in_month(month, year)
month = month.to_i
year = year.to_i
raise ArgumentError.new("invalid month") unless (1..12).include? month
first = Date.civil(year, month, 1)
next_month = first + 32
(next_month - next_month.mday).mday
end

An even simpler method, taken from elsewhere in the thread:

require 'date'

def days_in_month(month, year)
Date.civil(year, month, -1).mday
end

--Greg
 #11  
02-27-08, 07:50 PM
Dan Fitzpatrick
Shandy Nantz wrote:
> This is probably an easy question but I am trying to get at the number
> of days that are in a month. I have this calendar that I have built, the
> idea being that when a month turns from February to March, for example,
> the calendar should redisplay itself properly formated showing the new
> month and the correct number of days. I have it so that it starts
> counting the days on the right day of the week, but I have to know when
> to stop counting. Any ideas, Thanks,
>
> -S
>

If you don't want to use the Date module, this is the plain old way:

def days_in_month(m=Time.new.month,y=Time.new.year)
return [31,0,31,30,31,30,31,31,30,31,30,31][m-1] unless m == 2
((y % 4 == 0) and ( (!(y % 100 == 0)) or (y % 400 == 0) ) ) ? 29 : 28
end

Dan
 #12  
02-27-08, 08:14 PM
Rob Biedenharn
On Feb 27, 2008, at 2:17 PM, Gregory Seidman wrote:
> On Thu, Feb 28, 2008 at 03:29:54AM +0900, Brian Adkins wrote:


>
> Don't sigh at me. I wrote some code off the cuff and fired it off. I
> also
> didn't include unit tests. Yes, it was buggy and inefficient, but it
> got
> across the approach I was using.



The point is applicable to *everyone*:

"Don't present code that you haven't actually
run unless you *say* that you haven't run it."

You'll just end up confusing the OP or other readers that may benefit
from
the code. If you're trying to illustrate a point or an approach, say so
or make it quite clear that your code is incomplete or intended as
pseudo-code (particularly if it appears to be valid syntax).

-Rob

Rob Biedenharn http://agileconsultingllc.com
Rob
 #13  
02-27-08, 08:47 PM
7stud --
Gregory Seidman wrote:
> Don't sigh at me. I wrote some code off the cuff and fired it off. I
> also
> didn't include unit tests. Yes, it was buggy and inefficient, but it got
> across the approach I was using.
>


Thanks for caring, however this isn't a creative writing forum.
 #14  
02-27-08, 09:25 PM
James Britt
Rob Biedenharn wrote:

>
> The point is applicable to *everyone*:
>
> "Don't present code that you haven't actually
> run unless you *say* that you haven't run it."
>


Nah, better to let dubious code pop up now and then so that people are
not lulled into a false sense of security, and will hopefully realize
that, even if someone says they ran and tested the code and assure you
it's fine, the code may still be bad.
 #15  
02-28-08, 12:41 PM
Todd Benson
On Wed, Feb 27, 2008 at 2:14 PM, Rob Biedenharn
<Rob> wrote:
> The point is applicable to *everyone*:
>
> "Don't present code that you haven't actually
> run unless you *say* that you haven't run it."
>
> You'll just end up confusing the OP or other readers that may benefit
> from
> the code. If you're trying to illustrate a point or an approach, say so
> or make it quite clear that your code is incomplete or intended as
> pseudo-code (particularly if it appears to be valid syntax).
>
> -Rob


I frequently write bad code when I use a system where I cannot cut and
paste. All code on a forum, IMHO, should be taken with a grain of
salt. I don't think posted code needs to be perfect.

2c,
Todd

Similar Threads
Convert Number of Month to Number of days

Hi, I am doing a small analysis, where I need to convert Number of Month into number of days. For E.g. 25 month = __ # days. To better understand. Date =...

Number of days in month counted from shortened name of month & yea

I'd need to get the number of days in a month from the shortened name of month and a year. I have for example JAN in cell A1, and 2007 in cell A2, and I would need to get the...

how to get; number of days in a given month

Number of Days in a Month

Given a month/year is there a command that shows the number of days in that month please?

Number of Days in Month

I have the following code: StartDate = (((Now() - Day(Now())) - Format(Now() - Day(Now()), "d"))) EndDate = (Now() - Day(Now())) DayCount = 0 Do While StartDate <...


All times are GMT. The time now is 04:43 AM. | Privacy Policy