Robert Newson wrote:
> Dilwyn Jones wrote:
>
>>A help request:
>>
>>Is there a way of returning the current month as a number?
>
> I had thought I had come up with a function for this, but it is getting the
> ends of some months wrong, eg 1 May is coming out as 31 Apr! (Which seems
> odd as I thought I had checked out all the month bounds when writing the
> function...I'll have another look at it tomorrow.)
Had a fiddle with it this evening, and seem to have solved the problems
(I've checked it against the QL's DATE$() and it's matched as far as today
from 1 Jan 1961):
DEF PROC my_date(secs, dy, mn, yr)
dy = INT(secs / 86400) + 306
yr = INT((dy + .8) / 365.25)
dy = dy - INT(yr * 365.25) + 31
mn = INT(dy / 30.6)
dy = dy - INT((mn + 3) * 30.6) + 92
mn = mn + 2
IF mn > 12 : mn = mn - 12 : yr = yr + 1
yr = yr + 1960
END DEF
DEF my_mth_no(secs)
LOC dy, yr, mn
dy = INT(secs / 86400) + 306
yr = INT((dy + .8) / 365.25)
mn = INT((dy - INT(yr * 365.25) + 31) / 30.6) + 2
IF mn > 12 : mn = mn - 12
RET mn
END DEF
If you want an explaination of how they [supposedly] work, I'll be more than
happy to [try and] explain the algorithm.
my_date has been made a PROCedure which modifies its calling parameters as
more than 1 variable has to be set:
my_date secs, day, month, year
secs = number of secs since 01.01.1961 00:00:00 of date to extract
day = stored with day of month (1-31)
month = stored with month number (1-12)
year = stored with year (1961-2099)[1]
[1] Not checked beyond today. 2100 would be wrong (after 28.02.2100) as the
proc/fn doesn't realise it will not be a leap year; however, for the
required app, I don't think that would be too much of a problem.
I could have set a string and made it a function, but the whole point of the
exercise was that you were trying to extract the day/month/year from the
DATE$ (if I understood you properly) and it would have been a bit silly to
package them up in a string to be unpackaged again afterwards. An
alternative would be to add the three elements together, eg:
packed = (year - 1961) * 372 + (month - 1) * 31 + day - 1
Then:
day = packed MOD 31 + 1
month = INT(packed / 31) MOD 12 + 1
year = 1961 + INT(packed / 372)
my_mth_no takes one param: secs since ~ and returns the month number of that
date:
month = my_mth_no(secs)
Any help?
_______________________________________________
QL-Users Mailing List
http://www.q-v-d.demon.co.uk/smsqe.htm