Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Anzahl Tage im Monat (https://www.delphipraxis.net/130853-anzahl-tage-im-monat.html)

Susanne 14. Mär 2009 10:21


Anzahl Tage im Monat
 
Hallo,

kann mir vielleicht jemand sagen, was ich falsch mache?

Ich möchte die Anzahl der Tage im Monat zurückgeliefert bekommen, zu dem Datum das ich übergebe.

Delphi-Quellcode:

AnzDays:= 0;
AnzDays:= Daysinmonth(now);
ich bekomme als Ergebnis: 4643288.

Was läuft hier schief?

Danke und Gruß
Susanne

[edit=Luckie]Titel korrigiert. Mfg, Luckie[/edit]

IIIMADDINIII 14. Mär 2009 10:27

Re: Anzahl das im Monat
 
was ist den now

IIIMADDINIII 14. Mär 2009 10:30

Re: Anzahl das im Monat
 
ich habe bei mir nur daysthismonth

mkinzler 14. Mär 2009 10:30

Re: Anzahl das im Monat
 
Zitat:

Zitat von IIIMADDINIII
was ist den now

Eine Konstante welche den aktuellen TimeStamp enthält.

Phoenix 14. Mär 2009 10:31

Re: Anzahl das im Monat
 
@IIIMADDINIII Wenn Du Ergänzungen zu Deinem letzten Post hast, und noch kein anderer User geantwortet hat, dann klicke bitte auf EDIT rechts oben um die Information Deinem letzten Beitrag hinzuzufügen und schreibe nicht nochmal einen neuen. Das ist am Ende leserlicher.

Edit: Mit gutem Beispiel voran geh *g*

Zitat:

Zitat von mkinzler
Zitat:

Zitat von IIIMADDINIII
was ist den now

Eine Konstante welche den aktuellen TimeStamp enthält.

Diese Konbination ist gewöhnungsbedürftig *g*

mkinzler 14. Mär 2009 10:35

Re: Anzahl das im Monat
 
@Susanne: versuche mal Date() statt Now

IIIMADDINIII 14. Mär 2009 10:37

Re: Anzahl das im Monat
 
du kannst dir das auch selber pogramieren(ist nicht schwer)
du kannst auch einfach ein array erstellen mit den Tagen der einzelnen monaten erstellen und nach dem monatsnummer fragen und die in die rechteckigen klammer setzen.
vorher machste noch ein if um zu fragen ob der feburar gefragt ist. wenn dies der fall ist fragste wieder mit einem if ob das jahr durch 4 teilbar ist. Dann hat der monat 29 tage.

mkinzler 14. Mär 2009 10:38

Re: Anzahl das im Monat
 
Zitat:

du kannst dir das auch selber pogramieren(ist nicht schwer)
Ja kann man. Aber sollte man?

Luckie 14. Mär 2009 10:38

Re: Anzahl das im Monat
 
Zitat:

Zitat von IIIMADDINIII
ob das jahr durch 4 teilbar ist. Dann hat der monat 29 tage.

Also so einfach ist es nicht herauszufinden, ob es sich im ein Schaltjahr handelt.

Susanne 14. Mär 2009 10:39

Re: Anzahl das im Monat
 
sieht auch nicht besser aus :-(

es wäre halt schön, wenn es solche Funktionen gibt, man diese auch nutzen kann. Aber leider will diese wohl nicht so wie ich.

IIIMADDINIII 14. Mär 2009 10:40

Re: Anzahl das im Monat
 
warum kann man nicht das mit dem schaltjahr so leicht herausfinden??

mkinzler 14. Mär 2009 10:42

Re: Anzahl das im Monat
 
Zitat:

Zitat von IIIMADDINIII
warum denn nicht??

Warum das Rad neu erfinden? Zudem ist der Algorithmus etwas komplizierter (Schaltjahre usw)
@Susanne: Gibt es vielleicht eine gleichnamige Funktion aus einer anderen Unit als DateUtils, welche vorher eingebunden wird?

Luckie 14. Mär 2009 10:43

Re: Anzahl das im Monat
 
Keine Ahnung, was du falsch machst, aber bei mir funktioniert das:
Delphi-Quellcode:
uses
  DateUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
  days: Cardinal;
begin
  days := DaysInMonth(now);
  ShowMessage(IntToStr(days));
end;

Susanne 14. Mär 2009 10:51

Re: Anzahl Tage im Monat
 
ok, man sollte den Wert vielleicht auch aus der Funktion wieder zurückgeben, sobald ich dies an result übergebe funktioniert es auch.

Trotzdem vielen Dank für eure Hilfe. Ich hab vermutet, es musste irgendeine "Kleinigkeit" sein.

IIIMADDINIII 14. Mär 2009 10:59

Re: Anzahl Tage im Monat
 
sonst dieses script hätte auch funkitioniert
Delphi-Quellcode:
function TForm1.getdaysinmonth(date: TDATETIME): integer;
const
   monthday: array[1..12] of integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
if strtoint(formatdatetime('m', date)) <> 2 then
begin
  result := monthday[strtoint(formatdatetime('m', date))];
end
else
begin
  if round(strtoint(formatdatetime('yyyy', date)) / 4) = strtoint(formatdatetime('yyyy', date)) / 4 then result := 29
  else result := 28;
end;
end;

Sunlight7 14. Mär 2009 11:02

Re: Anzahl Tage im Monat
 
Zitat:

Zitat von IIIMADDINIII
sonst dieses script hätte auch funkitioniert

Nein, wie schon erwähnt ist nicht jedes 4 Jahr ein Schaltjahr ;)

IIIMADDINIII 14. Mär 2009 11:03

Re: Anzahl Tage im Monat
 
seit wann denn das

Luckie 14. Mär 2009 11:04

Re: Anzahl Tage im Monat
 
Noch mal, es reicht nicht zu überprüfen ob ein Jahr durch vier Teilbar ist, um herauszufiden, ob es sich ume ine Schaltjahr handelt:
Zitat:

Die vorherige julianische Schalttagsregelung wurde gleichzeitig dahingehend modifiziert, dass in alle Jahre, die nach Division durch vier eine natürliche Zahl ergeben, der 29. Februar als Schalttag eingefügt wird. Ausgenommen von dieser Schaltjahresregelung sind volle Jahrhunderte, die nicht glatt durch 400 teilbar sind.
Zitat:

Zitat von IIIMADDINIII
seit wann denn das

Seit wir vom Julianischen Kalender zum Gregorianischen umgestellt haben. Und das war nicht erst gestern. ;)

IIIMADDINIII 14. Mär 2009 11:07

Re: Anzahl Tage im Monat
 
dann fügt man das einfach mit hinzu
Delphi-Quellcode:
function TForm1.getdaysinmonth(date: TDATETIME): integer;
const
   monthday: array[1..12] of integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
if strtoint(formatdatetime('m', date)) <> 2 then
begin
  result := monthday[strtoint(formatdatetime('m', date))];
end
else
begin
  if (round(strtoint(formatdatetime('yyyy', date)) / 4) = strtoint(formatdatetime('yyyy', date)) / 4) and not(round(strtoint(formatdatetime('yyyy', date)) / 400) = strtoint(formatdatetime('yyyy', date)) / 400) then result := 29
  else result := 28;
end;
end;
wo ist das problem??

mkinzler 14. Mär 2009 11:08

Re: Anzahl Tage im Monat
 
@IIIMADDINIII:Dein Code hat mehrere Probleme:
1. Parametername Date: Ist auche ien Funktion. Es ist nicht sichergestellt, das der richtige Wert verwendet wird.
2. Ablage der Werte in einem array ist überflüssig.
3. Wandlung DateTime->String->Integer ist aufwendig besser gleich in einen Integer wandeln (DecodeDate())
4. Der Algorithmus ist komplexer:
Wenn durch 4 teilbar aber nicht durch 100 (nur wenn durch 400 teilbar sind)
1900 war kein Schaltjahr aber 2000.

DeddyH 14. Mär 2009 11:10

Re: Anzahl Tage im Monat
 
Dafür gibt es IsLeapYear, da wird das berücksichtigt.

IIIMADDINIII 14. Mär 2009 11:11

Re: Anzahl Tage im Monat
 
was macht denn dieses isleapptyear?

mkinzler 14. Mär 2009 11:13

Re: Anzahl Tage im Monat
 
Zitat:

Zitat von IIIMADDINIII
was macht denn dieses isleapptyear?

Gibt zurück ob das jahr ein Schaltjahr (leap year) ist

Luckie 14. Mär 2009 11:13

Re: Anzahl Tage im Monat
 
Aus der SysUtils.pas vom BSD2006:
Delphi-Quellcode:
function IsLeapYear(Year: Word): Boolean;
begin
  Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
end;

DeddyH 14. Mär 2009 11:13

Re: Anzahl Tage im Monat
 
Das sagt Dir, ob es sich um ein Schaltjahr handelt. F1 ist übrigens eine sehr nützliche Taste, die darf man gerne mal benutzen.

OldGrumpy 14. Mär 2009 11:14

Re: Anzahl Tage im Monat
 
Zitat:

Zitat von IIIMADDINIII
wo ist das problem??

Das sitzt vor Deinem Rechner :mrgreen: :twisted:

Sicherlich ist das Thema "Tage im aktuellen Monat" nur eine Kleinigkeit. Ich empfehle Dir trotzdem mal, über folgende Punkte nachzudenken:

- Warum das Rad neu erfinden?
- Warum selber Code schreiben (Zeitaufwand) für ein Problem das längst gelöst ist?
- Warum selber Code schreiben wenn gut getesteter Code bereits mitgeliefert wird?

Wenn Du Englisch kannst oder zumindest ein englisch-deutsches Wörterbuch bedienen kannst, dann schau Dir mal eine meiner Lieblingswebsites an :)

mkinzler 14. Mär 2009 11:14

Re: Anzahl Tage im Monat
 
Nur wenn man diese Funktion verwendet, bindet man ja DateUtils ein, dann kann man gleich DayInMonth() verwenden :zwinker:

Luckie 14. Mär 2009 11:14

Re: Anzahl Tage im Monat
 
Zitat:

Zitat von DeddyH
Das sagt Dir, ob es sich um ein Schaltjahr handelt. F1 ist übrigens eine sehr nützliche Taste, die darf man gerne mal benutzen.

Das ist bei den meisten Tastaturen die Taste, die noch wie neu aussieht. :duck: SCNR

IIIMADDINIII 14. Mär 2009 11:15

Re: Anzahl Tage im Monat
 
dann geht es ja noch leichter
Delphi-Quellcode:
function TForm1.getdaysinmonth(date: TDATETIME): integer;
const
   monthday: array[1..12] of integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
if strtoint(formatdatetime('m', date)) <> 2 then
begin
  result := monthday[strtoint(formatdatetime('m', date))];
end
else
begin
  if isleapjear(date) then result := 29
  else result := 28;
end;
end;

mkinzler 14. Mär 2009 11:17

Re: Anzahl Tage im Monat
 
@IIIMADDINIII: Du solltest dir die Antworten hier mal durchlesen!

IIIMADDINIII 14. Mär 2009 11:18

Re: Anzahl Tage im Monat
 
es biringt übung im programieren wenn man das tut

mkinzler 14. Mär 2009 11:19

Re: Anzahl Tage im Monat
 
Ich hatte aber oben deinen Code kommentiert.

IIIMADDINIII 14. Mär 2009 11:20

Re: Anzahl Tage im Monat
 
kommentieren mach ich nict so gern

Sunlight7 14. Mär 2009 11:22

Re: Anzahl Tage im Monat
 
Er meinte er hat in Beitrag #23 erklärt, warum Dein Code nicht optimal ist :zwinker:

lbccaleb 14. Mär 2009 11:27

Re: Anzahl Tage im Monat
 
Zitat:

Zitat von IIIMADDINIII
dann geht es ja noch leichter
Delphi-Quellcode:
function TForm1.getdaysinmonth(date: TDATETIME): integer;
const
   monthday: array[1..12] of integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
if strtoint(formatdatetime('m', date)) <> 2 then
begin
  result := monthday[strtoint(formatdatetime('m', date))];
end
else
begin
  if [b]isleapjear(date)[/b] then result := 29 //hier greifst du auf dateutils zu!
  else result := 28;
end;
end;


Wieso machst du es dir so umständlich???
Da du ehh DateUtils verwendest, musst du das doch nicht um tausend ecken machen, und lieber gleich die passende funktion aus der Unit "DateUtils" nehmen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16: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