Solved

How to read a date in a specified format

Posted on 1998-12-07
9
137 Views
Last Modified: 2012-05-04
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    
0
Comment
Question by:xasan
  • 4
  • 4
9 Comments
 
LVL 5

Expert Comment

by:scrapdog
ID: 1216362
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
 

Author Comment

by:xasan
ID: 1216363
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
 
LVL 5

Expert Comment

by:scrapdog
ID: 1216364
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
 

Author Comment

by:xasan
ID: 1216365
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
Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

 
LVL 5

Accepted Solution

by:
scrapdog earned 50 total points
ID: 1216366
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
 
LVL 5

Expert Comment

by:scrapdog
ID: 1216367
Are you there?
0
 
LVL 1

Expert Comment

by:bobbyo
ID: 1216368
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
 

Author Comment

by:xasan
ID: 1216369
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
 

Author Comment

by:xasan
ID: 1216370
Bobbyo

Your routine is excellent and I am trying to incorporte it into my program.  Thanks.  You made it all look aesy!!
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Restoring deleted objects in Active Directory has been a standard feature in Active Directory for many years, yet some admins may not know what is available.
This article explains how to prepare an HTML email signature template file containing dynamic placeholders for users' Azure AD data. Furthermore, it explains how to use this file to remotely set up a department-wide email signature policy in Office …
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now