![]() |
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:
Ich wette Ihr wisst das :love:
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; |
Re: Frage zu Zeitrechnung
Ich bin mir nicht sicher, aber ich glaube, die Funktionen "IncDay", "IncMinute", etc. berücksichtigen alles nötige.
|
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. |
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) |
Re: Frage zu Zeitrechnung
Es gibt in der Unit "DateUtils" schon eine Funktion für Schaltjahre:
Delphi-Quellcode:
Vielleicht bringt es Dir ja was...
function IsLeapYear(Year: Word): Boolean;
begin Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0)); end; |
Re: Frage zu Zeitrechnung
Sorry, Unit "SysUtils", aus DateUtils wird es nur mal aufgerufen! :oops:
|
Re: Frage zu Zeitrechnung
Hallo
versuche es mal mit folgendem Code :
Delphi-Quellcode:
Sollten weiter Fragen zur Zeitberechnung bestehen bitte melden.
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; Gruß Manni [edit=Daniel B]Delphi-Tags eingefügt. Mfg, Daniel B[/edit] |
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:
als Ergebnis bekommst Du immer die Anzahl der Tage des Monats zurueck, in dem der uebergebene
function AnzahlTageImMonat(aZeitPunkt: TDateTime) : word;
var aJahr: word; aMonat: word; begin DecodeDate(StartOfTheMonth(IncMonth(aZeitPunkt)) - 1, aJahr, aMonat, RESULT); end; Zeitstempel (aZeitPunkt) liegt. Gruss Frank |
Re: Frage zu Zeitrechnung
Das taucht jetzt wohl häufiger auf?
Vielleicht sollte das mal langsam in die CodeLib. ![]() ![]() ![]()
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; |
Re: Frage zu Zeitrechnung
Deine Code ganz oben, kannste etwas verkürzen:
Delphi-Quellcode:
Das sieht dann so aus:
min := akt_sek div 60;
akt_sek := akt_sek - (min * 60); {=} akt_sek := akt_sek mod 60;
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 19:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz