Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datum letzter Samstag? (https://www.delphipraxis.net/181188-datum-letzter-samstag.html)

Uwe Raabe 23. Jul 2014 21:59

AW: Datum letzter Samstag?
 
Um das nochmal zu verdeutlichen: Mein Einzeiler funktioniert nur deswegen, weil DayOfWeek für Sonntag 1 und Samstag 7 zurückgibt und weil nach dem letzten Samstag gefragt wurde. Bei Verwendung von DayOfTheWeek oder der Frage nach einem anderen Wochentag wird es ein klein wenig komplizierter.

Aber andererseits: Genau das war die Frage!

Namenloser 23. Jul 2014 22:03

AW: Datum letzter Samstag?
 
Man könnte auch einfach das Datum eines Referenzsamstags nehmen, die Differenz zum aktuellen Datum in Tagen bilden, durch 7 teilen, abrunden, und das Ergebnis wieder mit 7 multiplizieren.

Könnte höchstens mit Floating-Point-Ungenauigkeiten Probleme geben.

Stevie 23. Jul 2014 22:05

AW: Datum letzter Samstag?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1266480)
Funktioniert leider beides nicht an einem Sonntag...

Haha, das passiert, wenn die eigtl richtige Antwort direkt am Anfang gegeben wird, irgendwer dran rummäkelt und man sich davon einfach blenden lässt und man das denken einstellt. :wall:

Tjo in dem Fall ist es wirklich eine glückliche Fügung, dass der Tag nach dem gewünschten eine 1 zurückliefert bei DayOfWeek :)

Zoot 24. Jul 2014 06:11

AW: Datum letzter Samstag?
 
Zitat:

Zitat von Dejan Vu (Beitrag 1266447)
Eine schöne Lösung, die aber stillschweigend davon ausgeht, das der Samstag mit 7 kodiert wird. Ändert sich das irgendwann, funktioniert die Lösung nicht mehr. Das ist zwar unwahrscheinlich (das sich das ändert), aber denkbar. Zudem wird eine Portierung in eine andere Sprache hier vermutlich nicht funktionieren.

So schön, minimalistisch und elegant Uwes Lösung auch ist, ich würde vielleicht doch eine Schleife bevorzugen:
Delphi-Quellcode:
Function LastSaturday(Date : TDateTime) : TDateTime;
Const
  DaySaturday = 7;

Begin
  Result := Date - 1;
  While DayOfWeek(Result) <> DaySaturday do Result := Result - 1;
End;
Hier ist es vollkommen egal, was DayOfWeek liefert (enum, integer, string etc.) Die Version läuft immer und überall (solange es Samstage gibt).

Diese Version ist aber doch genauso abhängig davon, wie die Wochentage kodiert sind, da du nunmal DayOfWeek verwendest.
Liefert dieses für Samstag plötzlich 6 zurück, hast du ein Problem. Liefert es einen String, dann erst recht, dann meckert der Compiler.
Immer und Überall läuft das also nicht...

Sir Rufo 24. Jul 2014 06:36

AW: Datum letzter Samstag?
 
@Zoot

:thumb: Gut gemerkt.

So wäre es richtig(er), da es sich auf ein dokumentiertes zugesichertes Verhalten verlässt, wo die zurückgelieferten Werte selber egal sind. Delphi-Referenz durchsuchenSystem.DateUtils.DayOfTheWeek

Egal welcher Wert für Samstag zurückgegeben wird, dieser Wert ist gleich dem Wert der Konstanten
Delphi-Quellcode:
DaySaturday
.

Delphi-Quellcode:
uses DateUtils;

Function LastSaturday(Date : TDateTime) : TDateTime;
Begin
  Result := Date - 1;
  While DayOfTheWeek(Result) <> DaySaturday do Result := Result - 1;
End;
Ich halte es aber für sehr unwahrscheinlich, dass sich die eine oder andere Funktion ändern wird :)

himitsu 24. Jul 2014 07:21

AW: Datum letzter Samstag?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1266491)
Egal welcher Wert für Samstag zurückgegeben wird, dieser Wert ist gleich dem Wert der Konstanten
Delphi-Quellcode:
DaySaturday
.

Wobei man das, wie bereits erwähnt, dennoch mathematisch lösen kann.

Und gleichzeitig wird die Formel dann für alle Wochentage funktionieren. (wenn man nicht die speziell, für den Samstag, gekürzte Version verwendet)

Zoot 24. Jul 2014 07:23

AW: Datum letzter Samstag?
 
Noch ein Vorschlag ohne Schleife.

Delphi-Quellcode:
Function LastDow (const DateToMatch : TDateTime; const DowToMatch : Byte) : TDateTime;
begin
   result := DateToMatch - ((7 - DowToMatch + DayOfTheWeek(DateToMatch)) mod 7);
   if result = DateToMatch then
      result := result - 7;
end;
LastDow(Date, DayFriday) sollte dann den 18.7. ergeben.

Sir Rufo 24. Jul 2014 07:23

AW: Datum letzter Samstag?
 
Zitat:

Zitat von himitsu (Beitrag 1266495)
Zitat:

Zitat von Sir Rufo (Beitrag 1266491)
Egal welcher Wert für Samstag zurückgegeben wird, dieser Wert ist gleich dem Wert der Konstanten
Delphi-Quellcode:
DaySaturday
.

Wobei man das, wie bereits erwähnt, dennoch mathematisch lösen kann.

Und gleichzeitig wird die Formel dann für alle Wochentage funktionieren. (wenn man nicht die speziell, für den Samstag, gekürzte Version verwendet)

Ja, aber da wollte ich nicht weiter drauf eingehen ;)

Uwe Raabe 24. Jul 2014 07:27

AW: Datum letzter Samstag?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1266491)
Ich halte es aber für sehr unwahrscheinlich, dass sich die eine oder andere Funktion ändern wird :)

Gerade Delphi ist in Bezug auf Abwärtskompatibilität ziemlich konservativ. Die Einführung von DayOfTheWeek als ISO-konformes Pendant zu DayOfWeek unterstreicht das nochmal.

Ich habe erst einmal erlebt, daß die RTL bei einem Delphi-Wechsel ein anderes Ergebnis lieferte: In Delphi 1 war TDate als die Anzahl der Tage seit dem 1.1.0001 definiert, später wurde das auf den 31.12.1899 geändert.

baumina 24. Jul 2014 07:49

AW: Datum letzter Samstag?
 
8-) dass so eine süße kleine Frage so viel Grundlage bietet, dass ich hier 29 Beiträge dazu lesen durfte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 Uhr.
Seite 3 von 5     123 45      

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