Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tage zwischen 2 Wochentagen? (https://www.delphipraxis.net/48103-tage-zwischen-2-wochentagen.html)

Pseudemys Nelsoni 20. Jun 2005 20:48


Tage zwischen 2 Wochentagen?
 
Moin,

ich brauche eine Funktion die mir die Tage zwischen 2 Tagen liefert (als Zahl). Dabei geht es nur darum den Wochentag herauszubekommen. Der "Heute"-Tag hat immer den Index 0, das heisst wenn heute Donnerstag wäre, dann wäre Donnerstag 0, Freitag 1 usw... dementsprechend gilt das gleiche wenn ein anderer Tag wäre. Der Tag muss immer über die ersten 3 Buchstaben des Tages übergeben werden. Ich hatte mir das so gedacht:

Delphi-Quellcode:
function GetDayIdx(Day: string): Byte;
  function IdxByDay(Day: string; DAYS: array of string): Byte;
  var
    I: Integer;
  begin
    Result := 0;
    for I := 0 to 6 do
      if Lowercase(Day) = Lowercase(DAYS[I]) then
        Result := I+1;
  end;
const
  DAYS: array[1..7] of string = ('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun');
var
  Today, DayIdx: Byte;
begin
  Result := 0;
  Today := IdxByDay(DayOfWeekStr(Now), DAYS);
  if Today <> 0 then
  begin
    DayIdx := IdxByDay(Day, DAYS);
    if DayIdx <> 0 then
      Result := IdxByDay(DAYS[DayIdx-Today], DAYS);
  end;
end;
Leider gibt mir das immer "0" zurück. Nochmal anschaulicher was ich vorhabe:

Code:
|mon|tue|wed|thu|fri|sat|sun|
  4   5   6   0   1   2   3
^^^^^^So würde es aussehen wenn heute Donnerstag wäre.

Ich möchte die Funktion nun so aufrufen können:

Delphi-Quellcode:
i := GetDayIdx('tue');
das Ergebnis sollte dann "5" sein....


Hat jemand ne Idee wie ich das hinkriegen kann?

Nikolas 20. Jun 2005 21:07

Re: Tage zwischen 2 Wochentagen?
 
Mein Vorschlag:

Start: Nummer des heutigen Tags (mo=0, so=6);
Ende: Nummer des Zieltags

Delphi-Quellcode:
 ind := ((7-start)+Ende) mod 7;
Müsste eigentlich stimmen, ich hab mir einfach das Gitter aufgemalt
Code:
Mo: 0 1 2 3 4 5 6
Di: 6 0 1 2 3 4 5
usw.
Und dann etwas gespielt. Die erste Zeile runter bekomm ich mit 7-Tag, dann geh ich Ende Schritte nach rechts und schau noch, ob ich über die Sieben raus bin.

Flocke 20. Jun 2005 21:09

Re: Tage zwischen 2 Wochentagen?
 
1. Statt DayOfWeekStr benutze das:
Delphi-Quellcode:
Today := DayOfWeek(Now - 86400);
2. Bist du dir sicher, dass der Index immer positiv ist in der Zeile
Delphi-Quellcode:
Result := IdxByDay(DAYS[DayIdx-Today], DAYS);
[Edit]Hat die letzte Antwort erledigt[/Edit]

Zum Algorithmus: Willst du wissen, wie viele Tage es bis zum nächsten "Day" ist?

Hansa 20. Jun 2005 21:11

Re: Tage zwischen 2 Wochentagen?
 
Hi,

das hier betrifft jetzt auch den anderen Thread ! Wer so viele Postings hat, der müßte in der Lage sein folgendes zu bauen :

Delphi-Quellcode:
Wochentag [DayOfWeek (StrToDate (LeseFeld (AusgabeDS,'TAGNR')))];
Jetzt muß ich noch im Programm gucken. 8) LeseFeld betrifft nur DB - Sachen und hat nichts zu sagen. Da steht lediglich ein TDate drin. Die Funktion greift auf ein ARRAY of Strings zu und das ist als CONST deklariert.

Für den Rest wäre wohl DaysBetween zu empfehlen. 8) Siehe OH. :mrgreen:

Pseudemys Nelsoni 20. Jun 2005 21:25

Re: Tage zwischen 2 Wochentagen?
 
Danke @alle, ich guck mir die Beispiele gleich genauer an.

Zitat:

Zum Algorithmus: Willst du wissen, wie viele Tage es bis zum nächsten "Day" ist?
Jo, es geht darum, das ich eine DLL für mIRC schreibe, dort gibt es einen Link der folgendermassen aussieht:

dort steht "tag=0" für "heute", "1" für den nächsten, usw. Das geht halt bis 6 (7 Tage).

Nikolas 20. Jun 2005 21:31

Re: Tage zwischen 2 Wochentagen?
 
Zitat:

Für den Rest wäre wohl DaysBetween zu empfehlen.
Da werden aber zwei Dates übergeben und nicht die Namen von zwei Wochentagen!

WoGe 20. Jun 2005 21:33

Re: Tage zwischen 2 Wochentagen?
 
Du kannst deine function auch so modifizieren
Delphi-Quellcode:
  function GetDayIdx(Day: string): Byte;
const
  DAYS: array[1..7] of string = ('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun');

  function IdxByDay(Day: string): Byte;
  var
    I: Integer;
  begin
    Result := 0;
    for I := 1 to 7 do
      if (Lowercase(Day) = DAYS[I]) then
      begin
        Result := I;
         Label2.Caption := IntToStr(i);
      end;
  end;
var
  Today, DayIdx: Byte;
begin
  Result := 0;
  Today := IdxByDay(DayOfWeekStr(Now));
  if Today <> 0 then
  begin
    DayIdx := IdxByDay(Day);
    if DayIdx <> 0 then
      Result := IdxByDay(DAYS[DayIdx-Today]);
  end;
end;
das funzt dann

mfg
wo

Flocke 20. Jun 2005 21:53

Re: Tage zwischen 2 Wochentagen?
 
Die Idee mit dem 86400 von mir weiter oben vergiss mal (kleiner Denkaussetzer, andere Programmiersprache).

Das hier ist die kürzeste Lösung:
Delphi-Quellcode:
function GetDayIdx(const Day: string): Byte;
begin
  Result := (Pos(Lowercase(Day) + '|', ' |sun|mon|tue|wed|thu|fri|sat|') div 4 + 7 - DayOfWeek(Date)) mod 7;
end;
Gibt allerdings nicht immer 0 zurück für unbekannte Tage.

Hansa 21. Jun 2005 00:39

Re: Tage zwischen 2 Wochentagen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Denksport am Abend ist immer gut, vor allem wenn der Source am Ende weg ist. 8) Der ist zwar nicht weg, ich suche ihn aber jetzt nicht mehr. :mrgreen: @Pseudo : probiere die Exe mal aus. Mit den Tagen im voraus geht das so. Die negativen Zahlen zu berücksichtigen, das ist mir aber jetzt zu viel. Insgesamt waren es höchstens 10 Zeilen relevanter Quelltext. Bei Bedarf suche ich den. DaysBetween usw. wird nicht gebraucht.

Luckie 21. Jun 2005 00:53

Re: Tage zwischen 2 Wochentagen?
 
Letztendlich läuft es doch nur auf eine Rotation hinaus oder? Stellen wir uns zwei Scheiben mit den Wochentagen drauf vor, eine inner und eine äußere. Alles was jetzt passiert ist eine Verdrehung der beiden Scheiben gegeneinander. Denk mal etwas in diese Richtung. Und wenn ich mich nicht irre, entspricht dies doch der Cäsar oder Rot-YXZ Verschlüsselung. Das heißt, wenn du diese Verschlüsselung mit 26 Buchstaben hast, dann sollte es kein Problem sein es auf sechst Kürzel für Tage zu übertragen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz