Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu Zeitrechnung (https://www.delphipraxis.net/9685-frage-zu-zeitrechnung.html)

MrKnogge 1. Okt 2003 18:51


Frage zu Zeitrechnung
 
Hi,

ich möchte in meinem Programm Stunden, Minuten und Sekunden eingeben,
und das Programm soll mir dann sagen, was für ein Datum und welche
Uhrzeit dann ist.

Bei mir klappt das bisher nur soweit, bis die Tage "volllaufen" (31 glaub
ich). Aber wie finde ich herraus, ob der aktuelle Monat 28,29,30 oder 31
Tage hat :gruebel:

Hier nun mal meinen momentanen Code:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Caption := DateToStr(Now) + ' ' + TimeToStr(Now);
  Timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  day : word; // Tage
  std : word; // Stunden
  min : word; // Minuten
  sek : word; // Sekunden

  akt_year : word; // Jahre
  akt_month : word; // Monate
  akt_day : word; // stunden
  akt_std : word; // aktuelle Stunden
  akt_min : word; // aktuelle Minuten
  akt_sek : word; // aktuelle Sekunden
  akt_mil : word; // Milli-Sekunden

  ziel : TDateTime;
begin
  Form1.Caption := DateToStr(Now) + ' ' + TimeToStr(Now);
  std := SpinEdit1.Value;
  min := SpinEdit2.Value;
  sek := SpinEdit3.Value;

  DecodeDateTime(Now,akt_year,akt_month,akt_day,akt_std,akt_min,akt_sek,akt_mil);

  akt_std := akt_std + std;
  akt_min := akt_min + min;
  akt_sek := akt_sek + sek;

  min := akt_sek div 60;
  akt_sek := akt_sek-(min*60);

  akt_min := akt_min + min;
  std := akt_min div 60;
  akt_min := akt_min-(std*60);

  akt_std := akt_std + std;
  day := akt_std div 24;
  akt_std := akt_std-(day*24);

  akt_day := akt_day + day;

  ziel := EncodeDateTime(akt_year,akt_month,akt_day,akt_std,akt_min,akt_sek,akt_mil);

  Label1.Caption := DateTimeToStr(Ziel);
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (ssLeft in Shift) then begin
    ReleaseCapture;
    SendMessage(Form1.Handle,WM_SYSCOMMAND,SC_MOVE+1,0);
    end;
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
 if SpinEdit1.Text = '' then begin
   SpinEdit1.Text := '0';
   SpinEdit1.SelectAll;
   end;
end;

procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
 if SpinEdit2.Text = '' then begin
   SpinEdit2.Text := '0';
   SpinEdit2.SelectAll;
   end;
end;

procedure TForm1.SpinEdit3Change(Sender: TObject);
begin
 if SpinEdit3.Text = '' then begin
   SpinEdit3.Text := '0';
   SpinEdit3.SelectAll;
   end;
end;
Ich wette Ihr wisst das :love:

Christian S. 1. Okt 2003 18:59

Re: Frage zu Zeitrechnung
 
Ich bin mir nicht sicher, aber ich glaube, die Funktionen "IncDay", "IncMinute", etc. berücksichtigen alles nötige.

Christian Seehase 1. Okt 2003 18:59

Re: Frage zu Zeitrechnung
 
Moin MrKnogge,

ich würde das über eine zweidimensionale Tabelle mit Konstanten lösen.
In der ersten Dimension die Tageszahlen für jeden Monat, in dem kein Schaltjahr ist, die zweite Dimension unterscheidet sich dann nur noch im Februar.
Grundsätzlich ginge das auch mit einer Dimension, und man addiert nur 1 auf den Februar, wenn es ein Schaltjahr ist, aber ich finde die andere Variante einfacher.

Was bei der Berechnung des Schaltjahres gerne vergessen wird:
Glatte Jahrhunderte sind nur dann ein Schaltjahr, wenn sich das Jahr glatt durch 400 teilen lässt.
1900 war z.B. kein Schaltjahr.

MrKnogge 1. Okt 2003 19:07

Re: Frage zu Zeitrechnung
 
Also wann es n Schaltjahr ist und wann nicht, kann ich selbst errechnen, (hatten wir mal in der schule, war aber mehr als diese eine Bedingung !)

Aber eigentlich wollt ich mir mit dieser "kleinigkeit" nicht alzuviel arbeit machen, ich probier mal increment.

PS: Das mit einer 2-dimensionalen Tabelle kann ich nicht (zumindest noch nie davon gehört)

Daniel B 1. Okt 2003 19:13

Re: Frage zu Zeitrechnung
 
Es gibt in der Unit "DateUtils" schon eine Funktion für Schaltjahre:
Delphi-Quellcode:
function IsLeapYear(Year: Word): Boolean;
begin
  Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
end;
Vielleicht bringt es Dir ja was...

Daniel B 1. Okt 2003 20:06

Re: Frage zu Zeitrechnung
 
Sorry, Unit "SysUtils", aus DateUtils wird es nur mal aufgerufen! :oops:

Manni 14. Okt 2003 12:08

Re: Frage zu Zeitrechnung
 
Hallo

versuche es mal mit folgendem Code :

Delphi-Quellcode:
function IsLeapYear( nYear: Integer ): Boolean;
begin
Result := (nYear mod 4 = 0) and ((nYear mod 100 <> 0) or (nYear mod 400 = 0));
end;

function MonthDays( nMonth, nYear: Integer ): Integer;
const
DaysPerMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
Result := DaysPerMonth[nMonth];
if (nMonth = 2) and IsLeapYear(nYear) then Inc(Result);
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
Year, Month, Day, Hour : Word;
begin
DecodeDate(Now, Year, Month, Day);
edit1.text := inttostr(monthDays(Month, Year));
end;
Sollten weiter Fragen zur Zeitberechnung bestehen bitte melden.

Gruß Manni

[edit=Daniel B]Delphi-Tags eingefügt. Mfg, Daniel B[/edit]

Mr.Jones 14. Nov 2003 10:26

Re: Frage zu Zeitrechnung
 
Hi Mr.Knogge,

Deine Anfrage ist zwar schon ein bissl laenger her, ich hoffe aber ich kann Dir trotzdem helfen
probiers mal mit der hiermit:

Delphi-Quellcode:
function AnzahlTageImMonat(aZeitPunkt: TDateTime) : word;
var
  aJahr: word;
  aMonat: word;
begin
  DecodeDate(StartOfTheMonth(IncMonth(aZeitPunkt)) - 1, aJahr, aMonat, RESULT);
end;
als Ergebnis bekommst Du immer die Anzahl der Tage des Monats zurueck, in dem der uebergebene
Zeitstempel (aZeitPunkt) liegt.

Gruss Frank

himitsu 14. Nov 2003 10:57

Re: Frage zu Zeitrechnung
 
Das taucht jetzt wohl häufiger auf?

Vielleicht sollte das mal langsam in die CodeLib.

Schaltjahr
Brauche Hilfe zu TMonthCalendar
Letzter Tag im Monat (Datum) ermitteln

Delphi-Quellcode:
Function TageImMonat(Monat, Jahr: Integer): Integer;
  Begin
    Case Monat of
      1, 3, 5, 7, 8, 10, 12: Result := 31;
      4, 6, 9, 11: Result := 30;
      2: If ((Jahr mod 4 = 0) and (Jahr mod 100 <> 0)) or (Jahr mod 400 = 0) Then
           Result := 29 Else Result := 28;
      Else Result := -1;
    End;
  End;

himitsu 14. Nov 2003 11:34

Re: Frage zu Zeitrechnung
 
Deine Code ganz oben, kannste etwas verkürzen:
Delphi-Quellcode:
min := akt_sek div 60;
akt_sek := akt_sek - (min * 60);

{=}

akt_sek := akt_sek mod 60;
Das sieht dann so aus:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  akt_year : word; // Jahre
  akt_month : word; // Monate
  akt_day : word; // stunden
  akt_std : word; // aktuelle Stunden
  akt_min : word; // aktuelle Minuten
  akt_sek : word; // aktuelle Sekunden
  akt_mil : word; // Milli-Sekunden

begin
  Form1.Caption := DateToStr(Now) + ' ' + TimeToStr(Now);

  DecodeDateTime(Now,akt_year,akt_month,akt_day,akt_std,akt_min,akt_sek,akt_mil);

  akt_std := akt_std + SpinEdit1.Value;
  akt_min := akt_min + SpinEdit2.Value;
  akt_sek := akt_sek + SpinEdit3.Value;

  akt_min := akt_min + (akt_sek div 60);
  akt_sek := akt_sek mod 60;

  akt_std := akt_std + (akt_min div 60);
  akt_min := akt_min mod 60;

  akt_day := akt_day + (akt_std div 24);
  akt_std := akt_std mod 24;

  Label1.Caption := DateTimeToStr(EncodeDateTime(akt_year,akt_month,akt_day,akt_std,akt_min,akt_sek,akt_mil));
end;

Aber nun zurück zu deinem Problem.
Da kommst du auch ohne selbst die Monatslänge und Schaltjahre zu berücksichtigen hin. :mrgreen:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var z: TDateTime;
begin
  Z := Now;

  Form1.Caption := DateToStr(z) + ' ' + TimeToStr(z);

  Label1.Caption := DateTimeToStr(z + (SpinEdit1.Value / 24) +
    (SpinEdit2.Value / 1440) + (SpinEdit3.Value / 86400));
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz