home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Media Share 9
/
MEDIASHARE_09.ISO
/
os2
/
datofunk.zip
/
DATOFUNK.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-01-22
|
7KB
|
187 lines
unit datofunk;
{*****************************************************************************}
{* Datoberegninger skrevet af Henrik Krebs 13.12.1993 *}
{* *}
{* Normalt benyttes "dag-numre" til beregningen. Dag-nummeret er et l¢benum- *}
{* mer af typen dagnrt (=longint), hvor 1.1.1900 sættes lig 0. *}
{* Bemærk, at dagnummer mod 7 giver ugedagen (0=s¢ndag..6=l¢rdag). *}
{* *}
{* Dato er en streng af typen yyyymmdd (= string[8]). *}
{* *}
{* Uge er et heltal (type byte) i intervallet 1..53. *}
{* Bemærk, at der er dage i januar med ugenummer 53 og dage i december *}
{* med ugenummer 1. *}
{* *}
{* Arbejdsdag er false for f¢lgende dage (og true for resten): *}
{* a) l¢rdage og s¢ndage. *}
{* b) 1. jan, 5. jun, 24. dec, 25. dec, 26. dec, 31. dec *}
{* c) Forskydelige helligdage: *}
{* skærtorsdag, langfredag, 2. påskedag *}
{* bededag, Kr. himmelfart, 2. pinsedag). *}
{* *}
{* Programmet fungerer kun korrekt indenfor f¢lgende begrænsninger *}
{* Datoer: Datoer i tidsrummet 1.1.1900 .. 31.12.2099 *}
{* Dag-numre: Numre i intervallet 0 .. 73049 (samme interval som datoer) *}
{* *}
{* Der er ingen validering på korrekt input. Nonsens-input vil ikke medf¢re *}
{* runtime-error; det vil kun medf¢re, at resultatet er nonsens. *}
{* *}
{* Unit'en indeholder 2 type-deklarationer: *}
{* *}
{* yyyymmdd = string[8] *}
{* dagnrt = longint *}
{* *}
{* Unit'en indeholder 5 funktioner: *}
{* *}
{* DATO Returnerer dato for dag'de dag efter 1.1.1900 *}
{* DAG Returner l¢benummer for dato (Streng yyyymmdd). 19000101=0. *}
{* ARBEJDSDAG Retrunerer true, hvis dagnr er en arbejdsdag, ellers false. *}
{* UGE Returnerer ugenummer for dagnr. *}
{* IDAG Returnerer dag-nummer for dags dato *}
{* *}
{*****************************************************************************}
interface
{-------}
type
yyyymmdd = string[8];
dagnrt = longint;
{Funktioner}
function dato(dag:dagnrt):yyyymmdd;
function dag(dato:yyyymmdd):dagnrt;
function arbejdsdag(dagnr: dagnrt): boolean;
function uge(dagnr: dagnrt): byte;
function idag: dagnrt;
implementation
{------------}
uses dos;
function dato(dag:dagnrt):yyyymmdd;
{----------------------------------}
var
yyyymmddi,
wrk1: dagnrt;
wrk2: yyyymmdd;
begin{dato}
yyyymmddi:=(1900+dag*100 div 36525)*10000;
wrk1:=dag*100 mod 36525 + 3290;
if wrk1<9200 then dec(wrk1,180);
wrk1:=(wrk1 div 100)*100;
inc(yyyymmddi,wrk1 div 3056*100 + wrk1 mod 3056 div 100+1);
str(yyyymmddi:8,wrk2); dato:=wrk2;
end{dato};
function dag(dato:yyyymmdd):dagnrt;
{----------------------------------}
var
wrk1, i: dagnrt;
yyyy, mm, dd: longint;
errpos: integer;
begin{dag}
val(copy(dato,1,4),yyyy,errpos);
val(copy(dato,5,2),mm,errpos);
val(copy(dato,7,2),dd,errpos);
i:=mm*3057 div 100 + dd;
wrk1:=(yyyy-1900)*36525;
if mm<=2 then inc(wrk1,180);
dag:=i+(wrk1 div 100) - 32;
end{dag};
function idag: dagnrt;
{---------------------}
var
yyyy,mm,dd,dow: word;
wdato, w: yyyymmdd;
i: byte;
begin{idag}
getdate(yyyy,mm,dd,dow);
str(yyyy:4,wdato);
str(mm:2,w); wdato:=wdato+w;
str(dd:2,w); wdato:=wdato+w;
for i:=1 to 8 do if wdato[i]=' ' then wdato[i]:='0';
idag:=dag(wdato);
end{idag};
function sktdag(inyear: dagnrt): dagnrt;
{----------------------------------------}
var
wsktdag,yyyy: dagnrt;
a,c,d,f,g: integer;
errpos: integer;
wsktdato: yyyymmdd;
begin{sktdag}
val(copy(dato(inyear),1,4),yyyy,errpos);
a:=(yyyy-1900) mod 19; f:=yyyy mod 4 * 2; g:=yyyy mod 7 * 4;
d:=(a*19+24) mod 30; inc(f,g); g:=d*6; inc(f,g+5); f:= f mod 7;
wsktdag:=d+19+f;
if (wsktdag=54) or (wsktdag=53) and (a>10) and (d=28) and (f=6) then
dec(wsktdag,7);
str(yyyy,wsktdato);
sktdag:=dag(wsktdato+'0301')-1+wsktdag;
end{sktdag};
function arbejdsdag(dagnr: dagnrt): boolean;
{-------------------------------------------}
const
fdoffset: set of byte = [0, 1, 4, 29, 42, 53]; {Forskydelige helligdage
regnet ud fra skærtorsdag}
antalfaste = 6;
faste: array[1..antalfaste] of string[4] =
('0101','0605','1224','1225','1226','1231'); {Faste fridage}
var
i: byte;
mmdd: string[4];
testoffset: integer;
begin{arbejdsdag}
if dagnr mod 7 in [0, 6] then arbejdsdag:=false
else begin
testoffset:=dagnr-sktdag(dagnr);
{$B- "in"-operatoren giver fejl hvis testoffset er udenfor 0..255}
if ((testoffset>=0) and (testoffset<=53)) and (testoffset in fdoffset)
then arbejdsdag:=false
else begin
arbejdsdag:=true; mmdd:=copy(dato(dagnr),5,4);
for i:=1 to antalfaste do if mmdd=faste[i] then arbejdsdag:=false;
end{if else};
end{if else};
end{arbejdsdag};
function uge(dagnr: dagnrt): byte;
{---------------------------------}
var
dag1, nextdag1, mandag1, uge1mandag, nextuge1mandag: dagnrt;
wuge: integer;
begin{uge}
dag1:=dag(copy(dato(dagnr),1,4)+'0101');
repeat
mandag1:=dag1; while mandag1 mod 7 <> 1 do inc(mandag1);
if mandag1-dag1<4 then uge1mandag:=mandag1 else uge1mandag:=mandag1-7;
if dagnr>=uge1mandag then wuge:=(dagnr-uge1mandag) div 7+1 else wuge:=0;
if wuge<=0 then begin
dag1:=dag(copy(dato(dag1-7),1,4)+'0101');
end{if};
until wuge>0;
nextdag1:=dag(copy(dato(dagnr),1,4)+'1232');
if ((wuge>=52) and
(nextdag1 mod 7 in [2..4])) then begin
nextuge1mandag:=nextdag1;
while nextuge1mandag mod 7 <> 1 do dec(nextuge1mandag);
if dagnr>=nextuge1mandag then wuge:=1;
end{if};
uge:=wuge;
end{uge};
begin {initiering}
end{initiering}.