As we all know, Julian Date was fixed by Julius Caesar, this was a guy that played with PICs a lot - and look where it got him. The problem we have is that PBP doesn’t handle Roman Numerals too well, and whilst the idea of having a Linear Date is a good (and very useful) one, generally, we only have to handle the Century that we’re in. So let’s start our PIC’s handling of a Linear Date from 1st January 2000... this way an integer variable (counting in DAYS) can ‘theoretically’ handle over 170 years worth of data.
Now I don’t know about you, but it’s highly unlikely that any of my designs are still going to be working in the year 2170 (in best engineering tradditions they're only guaranteed to work until the warranty expires), and I’m sure not going to be fielding the tech-support calls. If you find that the date gets screwed past 05/06/2179 (integer value 65534), don't email me - I'm not interested.
Converting Linear DAYS Back to a Date in the form of YEAR, MONTH and DAY is a little tricky... This is a clumsy way of working out the result, however, the routine I actually use I’m not willing to share, so you’ll have to make do with this one I threw together this morning... starting at January 1 2000 it’s good for almost 180 years (and being a thoughtful kinda girl, I've accounted for the fact that Year 2100 is NOT a Leap Year)...
The Subroutine shares variables that I've used earlier in this thread, and is called with the Linear Date held in the variable DAYS, and returns with a useable YEAR, MONTH and DAY.
MelanieCode:CounterA var BYTE DAY var BYTE DAYS var WORD MONTH var BYTE TempA var WORD TempB var WORD YEAR var BYTE ' ' Subroutine Calculates Date from Linear Days ' ------------------------------------------- CalculateDateFromLinear: YEAR=0 DAYS=DAYS+1 For CounterA=4 to 183 TempA=CounterA//4 TempB=365 If TempA=0 then If CounterA<>104 then TempB=TempB+1 endif If DAYS>TempB then YEAR=YEAR+1 DAYS=DAYS-TempB else Goto CalculateMonth endif Next CounterA ' add 2000 to the YEAR value, ie YEAR=4 implies 2004. CalculateMonth: MONTH=0 CalculateMonthLoop: Lookup2 MONTH,[31,28,31,30,31,30,31,31,30,31,30,31],DAY IF TempA=0 then IF YEAR<>100 then If MONTH=1 then DAY=DAY+1 Endif Endif If DAYS>DAY then DAYS=DAYS-DAY MONTH=MONTH+1 Goto CalculateMonthLoop Endif MONTH=MONTH+1 DAY=DAYS Return




Bookmarks