By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,855 Members | 1,988 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,855 IT Pros & Developers. It's quick & easy.

Problems with using date functions

P: n/a
Hi,

I've used standard date functions in the past, but need to create
something a little different, as I am working on an investment
calculator.

What I need to do is validate two dates, and check for a complete
years. And a complete year is from day 1 until the proceeding day the
following year. A couple of examples:
01/01/2000 ---> 31/12/2000 --> 1 Complete year (Year 1)
01/01/2001 ---> 31/12/2001 --> 1 Complete year (Year 2)
01/01/2002 ---> 01/07/2002 --> 1 incomplete year (Year 3)

another example

31/01/2000 ---> 30/01/2001 ---> 1 Complete Year (Year 1)

I can probably manage to calculate the number of complete and
incomplete years, but how do I work out '1 Complete Year' from PHP's
internal functions ?

P.S. This may not be logical, but it is for a calculation devised by
the UK Inland Revenue .....

Thanks in advance for any suggestions...

Rgds
SS.

Jul 24 '05 #1
Share this Question
Share on Google+
1 Reply


P: n/a
>What I need to do is validate two dates, and check for a complete
years. And a complete year is from day 1 until the proceeding day the
following year. A couple of examples:
01/01/2000 ---> 31/12/2000 --> 1 Complete year (Year 1)
01/01/2001 ---> 31/12/2001 --> 1 Complete year (Year 2)
01/01/2002 ---> 01/07/2002 --> 1 incomplete year (Year 3)

another example

31/01/2000 ---> 30/01/2001 ---> 1 Complete Year (Year 1)

I can probably manage to calculate the number of complete and
incomplete years, but how do I work out '1 Complete Year' from PHP's
internal functions ?
Ok, first the algorithm:

1. take the end of the range, add one day, and call it the "end date"
(ok, this is being a bit loose with terminology: I don't care. It's
really the day after the end). break this up into the "end year",
"end month", and "end day".
2. take the start of the range, and call this the "start date".
break this up into the "start year", "start month", and "start day".
3. Subtract the start year from the end year. This is the tentative
number of complete years.
4. If the end month is less than the start month, the number of complete
years is the number from (3) minus one.
5. If the end month is equal to the start month, and the end day is less
than the start day, the number of complete years is the number from
(3) minus one.
6. If (4) and (5) don't apply, the number from (3) is the number of complete
years.

I am assuming here that:
29/2/1996 -> 28/2/1997 *IS* one complete year, and
28/2/1996 -> 28/2/1997 *IS* one complete year, and
1/3/1995 -> 29/2/1996 *IS* one complete year, and
1/3/1995 -> 28/2/1996 *IS NOT* one complete year.

This seems reasonable, but you never can tell with tax laws.
In MySQL, assuming you start with a DATE type, you can use ADDDATE()
to add one day, and break apart the pieces of the date with YEAR(),
MONTH(), and DAYOFMONTH() for (1) and (2). (WARNING: MySQL date
types have a Y10K problem, but this is unlikely to be a real problem
for tax and investment calculations).

The rest is math on single numbers, which can be done with IF() and
subtraction and comparison operators.

In PHP, convert the date into a UNIX timestamp (PROBLEM HERE: if
dates can legitimately extend before 1970, expect trouble, as holding
an investment for 36 years or more is certainly not unheard of)
with strtotime(), add 24*60*60 seconds, and then break it apart
again with localtime() for (1) and (2). An alternative is to break
the dates apart manually and add 1 day to the end manually, using
a lot of knowledge about the lengths of months and leap year rules
to propagate carries from the day to the month to the year as needed.

The rest is math on single numbers, which can be done with if and
subtraction and comparison operators.

Gordon L. Burditt


P.S. This may not be logical, but it is for a calculation devised by
the UK Inland Revenue .....

Thanks in advance for any suggestions...

Rgds
SS.

Jul 24 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.