How to read a date in a specified format

I am using Turbo Pascal for DOS ver 7.0

I would like to read a date from user as DD/MMM/YY where DD is the Day and MMM is the first three characters of the month and YY is the year ie 98.  As user enters DD I would like to move cursor after the '/' etc.  Then  I would like to I would like to display how many days since first of Jan that year.  Ie.  if user enters 12/Feb/98 I would display 43 days of yaer 98 so far.

I wonder if this is possible in Pascal ( I am do VB programming and have some Pascal background).  Really I am after some code that can actually do rhis without using assembler

Please if posting code add comments.  You can send code to hshhussein@mcmail.com or post it here

Thank you all    
xasanAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

scrapdogCommented:
Not only is this possible, it shouldn't be too difficult.  However, you won't be able to do it using readln.  Your best bet would be to use readkey, the manual echo the key pressed to the screen.  You can use gotoxy to position the cursor at the point on the screen where the character goes.  Once a key is pressed, increment the position, and if there is a / in that position, juts increment two positions.  Check your help file on gotoxy and readkey (they are both in the crt unit I think).

To get the julian date, you will first have to determine if the current year is a leap year.  Do this by taking the year mod 4.  If it is 0, (with the possible exception of the year being 00), it is a leap year.

Make an array (constant) containing the julian date of the begin of each month (i.e. month 1 = 1, month 2 = 32, month 3 = 50, month 4 = 81, etc.).  If you call this array montharray, you could calculate the day of the year using this formula

day := montharray[monthnum]+dayofmonth;
if leapyear and monthnum>2 then day := day + 1;

0
xasanAuthor Commented:
ScrapDog

Thank you very much for the idea and I will attempt it.  However, I do not think I will be able to do it.  My Pascal is very basic.  If you could give me code to do what you said I would be so grateful.  Or at least how to read the date date from the user using ReadKey and also validating it

Thanks again - I know I am asking too much, but that is how desperate I am.

Thanks once more
0
scrapdogCommented:
Damn, I just wrote a program that would do exactly what you wanted.  But my computer crashed, and I forgot to save the damn thing!!!

I will rewrite it but I am not in the mood right now.  I will get back to you later.
0
Why Diversity in Tech Matters

Kesha Williams, certified professional and software developer, explores the imbalance of diversity in the world of technology -- especially when it comes to hiring women. She showcases ways she's making a difference through the Colors of STEM program.

xasanAuthor Commented:
Sorry ScrapDog but I have to let others answer it because I need it urgently.

It is still open to you so please try again



0
scrapdogCommented:
Here it is.  I had to rewrite it, so needless to say I put a lot of time into it.  It isn't PERFECT, but see how good it works for you.  You will probably have to make a few alterations here and there to fit your needs.
--------------------------------

uses crt;

const
  monthstring = 'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
  daysinmonth :array[1..12] of integer =
                (31,28,31,30,31,30,31,31,30,31,30,31);


var month, day, year :string;

procedure keytoday(key :char;  var count :integer);
begin
  if (count=1) and not (key in ['0'..'3']) then exit;
  if key = #8 then begin  count := 1;  day := '  ';  exit; end;
  if not (key in ['0'..'9']) then exit;
  day[count] := key;  count := count + 1;
end;

procedure keytomonth(key :char;  var count :integer);
var temp :string; mpos :integer;
begin
  if (key = #8) then begin
     month[count-2] := ' ';
     count := count - 1;
     exit;
  end
  else begin
    if (count=3) and (upcase(key) in ['A','N']) then begin
      month[1] := upcase(key); count := 4;  exit;
    end;
    temp := month;
    temp[count-2] := upcase(key);
    temp := copy(temp,1,count-2);
    mpos := pos(temp,monthstring)-1;
    if (mpos mod 3) = 0 then begin
      month[count-2] := upcase(key);
      count := count + 1;
    end;
  end;
end;

procedure keytoyear(key :char;  var count :integer);
begin
  if key = #8 then begin year[count-5] := ' ';  count := count - 1;  exit; end;
  if not (key in ['0'..'9']) then exit;
  year[count-5] := key;
  count := count + 1;
  exit;
end;

var
  key :char;
  count, i, monthnum, numday, numyear, dayofyear, code, leapyear :integer;
begin
  count := 1;
  month := '   ';  day := '  ';   year := '  ';
  while (count<=7) do begin
    key := readkey;
    if upcase(key)='X' then exit;
    if count < 3 then keytoday(key,count)
    else if count < 6 then keytomonth(key,count)
    else keytoyear(key,count);
    gotoxy(1,wherey);
    write(day+'/'+month+'/'+year);
  end;
  val(day, numday, code);
  monthnum := (pos(month,monthstring)-1) div 3 + 1;
  if numday>daysinmonth[monthnum] then numday := daysinmonth[monthnum];
  val(year, numyear, code);
  leapyear := 0;
  if ((numyear mod 4) = 0) and (numyear <> 0) then leapyear := 1;
  dayofyear := 0;
  for i := 2 to monthnum do
    dayofyear := dayofyear + daysinmonth[i-1];
  dayofyear := dayofyear + numday;
  if monthnum>2 then dayofyear := dayofyear + leapyear;
  writeln;
  writeln('Day of year:  ',dayofyear);
  readln;
end.

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
scrapdogCommented:
Are you there?
0
bobbyoCommented:
This is a small routine that I have used in the passed have a look.

Uses Crt;

Var

   Date : String;
   Mask : String;

Procedure ReadString(X,Y : Byte;Var S : String; MaxLength : Byte);
Var
   Ch : Char;
   TmpString : String;
   WasSlash : Boolean;
Begin
   TmpString := '';
   GotoXY(X,Y);
   Repeat
      Repeat
         Ch := UpCase(Readkey);
      Until (Ch In ['A'..'Z',#13,#8,'0'..'9']);
      WasSlash := False;
      If Ch = #8 Then
            If TmpString[Length(TmpString)] = '/'
               Then Delete(TmpString,Length(TmpString)-1,2)
               Else Delete(TmpString,Length(TmpString),1);
      Case Length(TmpString) Of
        0..1 : If Ch In ['0'..'9'] Then
               Begin
                  TmpString := TmpString + Ch;
               End;
       3..5 : If Ch In ['A'..'Z'] Then
              Begin
                  TmpString := TmpString + Ch;
              End;
       6..8 : If Ch In ['0'..'9'] Then
              Begin
                  TmpString := TmpString + Ch;
              End;
      End;
      If Length(TmpString) = 2 Then TmpString := TmpString + '/';
      If Length(TmpString) = 6 Then TmpString := TmpString + '/';
      GotoXY(X,Y);
      Write('         ');
      GotoXY(X,Y);
      Write(TmpString);
   Until Ch = #13;
   S := TmpString;
End;

Begin
   ReadString(1,1,Date,9);
End.
0
xasanAuthor Commented:
Scrapdog,

Sorry, Christmas shopping is taking all my time.  Thanks for the answer, I learned a lot from it and I have actually modified a little to suit me.  
0
xasanAuthor Commented:
Bobbyo

Your routine is excellent and I am trying to incorporte it into my program.  Thanks.  You made it all look aesy!!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Pascal

From novice to tech pro — start learning today.