Solved

How to read a date in a specified format

Posted on 1998-12-07
9
138 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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Often, people trade privacy and security for convenience. However in today's concrete jungle, this is an extremely foolish decision considering the vast amount of technologies being used against consumer interest. First off, I won't waste any time e…
This article lists the top 5 free OST to PST Converter Tools. These tools save a lot of time for users when they want to convert OST to PST after their exchange server is no longer available or some other critical issue with exchange server or impor…
This tutorial demonstrates a quick way of adding group price to multiple Magento products.
This video explains how to create simple products associated to Magento configurable product and offers fast way of their generation with Store Manager for Magento tool.

919 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

15 Experts available now in Live!

Get 1:1 Help Now