• PicŪ Basic


  • Calculate the number of days between two dates

    There are occasions when you need to calculate the number of days between two dates. This on first thought is a complex task, what with all those variable days in a month, and leap years..

    However with a little thought the answer turn out to be relatively simple. The trick is to work from a known set point, in these examples the date is the year 1st Jan 2000, but once you understand the principals you can adapt it to your own requirements.

    There are two examples; the first is a program using Case to work out its days per month calculations. The second uses Branch, while not so easy to read it uses a 1/3rd less code.

    Please note the code below was corrected on the 22nd of March 04 due to an transcribing error.

    Tim Box

    Example Code

    'days caculation,since 1/1/2000 to 31/12/2099
    Include "proton_4.inc"

    Dim Year as Word
    Dim Month as byte
    Dim Day as byte
    dim Hour as byte
    Dim Total_Days as word
    Dim Complete_Years as byte
    Dim Complete_Years_Days as word
    Dim Current_Year_leap as byte

    Year=2005
    Month=1
    Day=1

    Total_Days=0
    Complete_Years= Year-2000 ' calculate number of completed years

    If Complete_Years>0 then
    Complete_Years_Days =Complete_Years*365+((Complete_Years-1)/4) +1
    endif

    Current_Year_leap = Complete_Years//4 ' if 0 it is leap

    select Month ' add the days of completed months
    CASE 1
    Total_Days= Complete_Years_Days
    CASE 2
    Total_Days= Complete_Years_Days + 31
    CASE 3
    Total_Days= Complete_Years_Days + 59 '31+28
    CASE 4
    Total_Days= Complete_Years_Days + 90 '31+28+31
    CASE 5
    Total_Days= Complete_Years_Days + 120 '31+28+31+30
    CASE 6
    Total_Days= Complete_Years_Days + 151 '31+28+31+30+31
    CASE 7
    Total_Days= Complete_Years_Days + 181 '31+28+31+30+31+30
    CASE 8
    Total_Days= Complete_Years_Days + 212 '31+28+31+30+31+30+31
    CASE 9
    Total_Days= Complete_Years_Days + 243 '31+28+31+30+31+30+31+31
    CASE 10
    Total_Days= Complete_Years_Days + 273 '31+28+31+30+31+30+31+31+30
    CASE 11
    Total_Days= Complete_Years_Days + 304 '31+28+31+30+31+30+31+31+30+31
    CASE 12
    Total_Days= Complete_Years_Days + 334 '31+28+31+30+31+30+31+31+30+31+30
    ENDSELECT

    Total_Days=Total_Days+ Day ' add the current month days

    IF MONTH >2 AND Current_Year_leap=0 THEN Total_Days=Total_Days+1 ' add 1 if the current year is leap, and the month >2

    print at 1,1, dec Total_Days ' total days including the current day

    Stop

    'DAYS CACULATION,SINCE 1/1/2000 TO 31/12/2099
    INCLUDE "PROTON_4.INC"

    DIM YEAR AS BYTE
    DIM MONTH AS BYTE
    DIM DAY AS BYTE
    DIM HOUR AS BYTE
    DIM TOTAL_DAYS AS WORD
    DIM COMPLETE_YEARS AS BYTE
    DIM COMPLETE_YEARS_DAYS AS WORD
    DIM CURRENT_YEAR_LEAP AS BYTE
    DIM MONTH_DAYS AS WORD
    DIM CALC_TEMP

    GOTO START

    '--- YEAR CALC SUBS ---------------
    TOTAL_CALC:
    TOTAL_DAYS = COMPLETE_YEARS_DAYS + MONTH_DAYS
    GOTO BRA_EXIT
    '----------------------------------

    CALC_DAYS:

    TOTAL_DAYS=0

    COMPLETE_YEARS= YEAR - 00 ' CALCULATE NUMBER OF COMPLETED YEARS

    IF COMPLETE_YEARS > 0 THEN
    CALC_TEMP = (COMPLETE_YEARS-1)/4)
    COMPLETE_YEARS_DAYS =COMPLETE_YEARS * 365 + CALC_TEMP +1
    ENDIF

    CURRENT_YEAR_LEAP = COMPLETE_YEARS//4 ' IF 0 IT IS LEAP

    BRANCH MONTH, [BRA_EXIT,JAN,FEB,MAR,APR,MAY,JUN,JULY,AUG,SEPT,OCT ,NOV,DECM]
    ' ADD THE DAYS OF COMPLETED MONTHS
    JAN:
    TOTAL_DAYS= COMPLETE_YEARS_DAYS
    GOTO BRA_EXIT
    FEB:
    MONTH_DAYS = 31
    GOTO TOTAL_CALC
    MAR:
    MONTH_DAYS = 59
    GOTO TOTAL_CALC
    APR:
    MONTH_DAYS = 90
    GOTO TOTAL_CALC
    MAY:
    MONTH_DAYS = 120
    GOTO TOTAL_CALC
    JUN:
    MONTH_DAYS = 151
    GOTO TOTAL_CALC
    JULY:
    MONTH_DAYS = 181
    GOTO TOTAL_CALC
    AUG:
    MONTH_DAYS = 212
    GOTO TOTAL_CALC
    SEPT:
    MONTH_DAYS = 243
    GOTO TOTAL_CALC
    OCT:
    MONTH_DAYS = 273
    GOTO TOTAL_CALC
    NOV:
    MONTH_DAYS = 304
    GOTO TOTAL_CALC
    DECM:
    MONTH_DAYS = 334
    GOTO TOTAL_CALC

    BRA_EXIT:
    TOTAL_DAYS=TOTAL_DAYS+ DAY ' ADD THE CURRENT MONTH DAYS

    IF MONTH >2 THEN
    IF CURRENT_YEAR_LEAP = 0 THEN
    TOTAL_DAYS=TOTAL_DAYS+1 ' ADD 1 IF THE CURRENT YEAR IS LEAP, AND THE MONTH >2
    ENDIF
    ENDIF
    RETURN

    START:
    YEAR=05
    MONTH=12
    DAY=1

    GOSUB CALC_DAYS

    PRINT AT 1,1, DEC TOTAL_DAYS ' TOTAL DAYS INCLUDING THE CURRENT DAY

    STOP
    contributed by Mohammed Tayem.
  • Recent Activity

    towlerg-21522

    PIC18F1330 PLL problem

    Thread Starter: rcurl

    I'm just starting out on a new project that uses a PIC18F1330. I haven't used this specific chip before, so I began by trying to blink an LED just...

    towlerg Yesterday, 16:26 Go to last post
    towlerg-21522

    Pic16f18877 oread

    Thread Starter: evoortman

    Hi, On a PIC16F18877 the OREAD command doesn't seem to work. The code is working on a PIC16F1939. Both controllers use 32MHz int osc. If i...

    towlerg Yesterday, 16:25 Go to last post
    palamont-28794

    MID$ Problem with a PIC18F25K22

    Thread Starter: palamont

    Hi everybody, I encounter a strange problem : I have a string of 230 characters. This string is divided into 10 segments of 23 characters, with a...

    palamont Yesterday, 10:08 Go to last post