AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu Zeitrechnung

Ein Thema von MrKnogge · begonnen am 1. Okt 2003 · letzter Beitrag vom 14. Nov 2003
Antwort Antwort
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#1

Frage zu Zeitrechnung

  Alt 1. Okt 2003, 19:51
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

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
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von Christian S.
Christian S.

Registriert seit: 19. Apr 2003
Ort: Düsseldorf
835 Beiträge
 
#2

Re: Frage zu Zeitrechnung

  Alt 1. Okt 2003, 19:59
Ich bin mir nicht sicher, aber ich glaube, die Funktionen "IncDay", "IncMinute", etc. berücksichtigen alles nötige.
Christian S.
Admin in der Entwickler-Ecke
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Frage zu Zeitrechnung

  Alt 1. Okt 2003, 19:59
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Frage zu Zeitrechnung

  Alt 1. Okt 2003, 20:07
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)
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#5

Re: Frage zu Zeitrechnung

  Alt 1. Okt 2003, 20:13
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...
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#6

Re: Frage zu Zeitrechnung

  Alt 1. Okt 2003, 21:06
Sorry, Unit "SysUtils", aus DateUtils wird es nur mal aufgerufen!
  Mit Zitat antworten Zitat
Manni

Registriert seit: 14. Okt 2003
2 Beiträge
 
#7

Re: Frage zu Zeitrechnung

  Alt 14. Okt 2003, 13:08
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]
  Mit Zitat antworten Zitat
Benutzerbild von Mr.Jones
Mr.Jones

Registriert seit: 6. Nov 2003
Ort: Kassel
1 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: Frage zu Zeitrechnung

  Alt 14. Nov 2003, 11:26
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
It's not a Trick - It's Mr. Jones
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

Re: Frage zu Zeitrechnung

  Alt 14. Nov 2003, 11:57
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;
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

Re: Frage zu Zeitrechnung

  Alt 14. Nov 2003, 12:34
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.
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;
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 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