Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

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)

DeddyH 23. Jul 2014 14:45

AW: Datum letzter Samstag?
 
DayOfTheWeek gibt es sehr wohl:
Zitat:

Hinweis: DayOfTheWeek ist ISO 8601-konform (Montag ist der erste Wochentag). Die Funktion DayOfWeek basiert dagegen auf dem Sonntag als erstem Wochentag.
Und schon ist das erklärt.

himitsu 23. Jul 2014 14:46

AW: Datum letzter Samstag?
 
Jupp, drumm hatte ich auch beide Funktionen erwähnt und verlinkt.

Zitat:

Zitat von Stevie (Beitrag 1266441)
Wennde die noch für 64-bit schreibst, dann bekommste auch nen Fleißbienchen in dein Aufgabenheft: :lol:

ARM (iOS, Android), Mac und Linux nicht vergessen. :stupid:

p80286 23. Jul 2014 14:47

AW: Datum letzter Samstag?
 
Aus der OH:

Zitat:

DayOfWeek gibt den Wochentag zum angegebenen Datum als Integer zwischen 1 und 7 zurück. Dabei ist Sonntag Tag 1 und Samstag Tag 7.
Hinweis:
DayOfWeek ist nicht mit dem ISO 8601-Standard konform, in dem Montag als der erste Tag der Woche definiert wird. Die Funktion DayOfTheWeek stimmt mit dem ISO 8601-Standard überein.
Kommt drauf an wie man es sieht

Gruß
K-H

Aphton 23. Jul 2014 14:53

AW: Datum letzter Samstag?
 
Off-By-One Fehler.. na und :P
Edit: Tut im Grunde genau #3 hab mich nur um "1" vertan

Dejan Vu 23. Jul 2014 15:00

AW: Datum letzter Samstag?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1266424)
Delphi-Quellcode:
result := Date - DayOfWeek(Date);

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).

Alternative: ISO-8601-Routine verwenden;
Delphi-Quellcode:
function LastSaturday (aDate : TDateTime) : TDateTime;
Var
  LastSunday : TDateTime;
Begin
  LastSunday := EndOfTheWeek(aDate-7);
  Result := LastSunday - 1;
End;
Laut ISO ist der letzte Tag der Woche der Sonntag. Und die ISO ändert sich nicht, außer bei Übernahme durch Außerirdische/Nordkorea.

Stevie 23. Jul 2014 15:05

AW: Datum letzter Samstag?
 
Zitat:

Zitat von himitsu (Beitrag 1266443)
Jupp, drumm hatte ich auch beide Funktionen erwähnt und verlinkt.

Zitat:

Zitat von Stevie (Beitrag 1266441)
Wennde die noch für 64-bit schreibst, dann bekommste auch nen Fleißbienchen in dein Aufgabenheft: :lol:

ARM (iOS, Android), Mac und Linux nicht vergessen. :stupid:

Das wär die Bonusaufgabe für Streber gewesen :stupid:

P.S. Die Lösung von Uwe in ne Methode verpackt (wenn man will noch nen inline dran geklatscht) ist sogar ein paar Ticks schneller als die asm Implementierung. Soviel zu "ick schreib det ma in assembla, det is schnella" ;)

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.

Das ist fast genauso wahrscheinlich wie eine "Übernahme durch Außerirdische/Nordkorea."

Zitat:

Zitat von Dejan Vu (Beitrag 1266447)
Delphi-Quellcode:
function LastSaturday (aDate : TDateTime) : TDateTime;
Var
  LastSunday : TDateTime;
Begin
  LastSunday := EndOfTheWeek(aDate-7);
  Result := LastSunday - 1;
End;

EndOfTheWeek ruft übrigens StartOfTheWeek auf, was wiederrum DayOfTheWeek aufruft.
Dann doch lieber gleich:
Delphi-Quellcode:
function LastSaturday(aDate: TDateTime): TDateTime;
begin
  Result := aDate - DayOfTheWeek(aDate) - 1;
end;

himitsu 23. Jul 2014 15:11

AW: Datum letzter Samstag?
 
So als LastWeekDay/Next... (oder so) würde das auch gut in die DateUtils vom XE9 passen. (bzw. als Helper ans TDateTime dran)


Im Delphi gibt/gab es mal 3 Kodierungen, in verschiedenen Funktionen.

Kombinationen aus
1..7 oder 0..6
und
So..Sa oder Mo..So

Dejan Vu 23. Jul 2014 15:17

AW: Datum letzter Samstag?
 
Zitat:

Zitat von Stevie (Beitrag 1266449)
Zitat:

Zitat von Dejan Vu (Beitrag 1266447)
...Ändert sich das irgendwann, funktioniert die Lösung nicht mehr. Das ist zwar unwahrscheinlich (das sich das ändert), aber denkbar.

Das ist fast genauso wahrscheinlich wie eine "Übernahme durch Außerirdische/Nordkorea."

Schön, das Du meine Anmerkung bestätigst. Es ist denkbar, und das reicht für mich als kleiner design flaw. Zudem ist der Code unverständlich (man muss das Manual/OH zitieren, um zu verstehen, was da abgeht). Die Schleife ist sofort durchschaubar, die ISO-Variante auch. Beides ist unwesentlich länger, ergo akzeptabel und eventuell zu bevorzugen.
Zitat:

Zitat von Stevie (Beitrag 1266449)
EndOfTheWeek ruft übrigens StartOfTheWeek auf, was wiederrum DayOfTheWeek aufruft.
Dann doch lieber gleich:

Ich schlage mich nicht mit Implementierungsdetails einer API herum. Sie bietet mir 'EndOfTheWeek' und das verwende ich dann. Geht es um Nichtverwendung von API-Aufrufen oder um Verständnis des Codes? Sei wenigstens so konsequent und ersetze dann 'DayOfTheWeek' gleich durch den Formelsalat, der vermutlich dahintersteht? ;-)

Stevie 23. Jul 2014 21:36

AW: Datum letzter Samstag?
 
Zitat:

Zitat von Dejan Vu (Beitrag 1266454)
Ich schlage mich nicht mit Implementierungsdetails einer API herum. Sie bietet mir 'EndOfTheWeek' und das verwende ich dann. Geht es um Nichtverwendung von API-Aufrufen oder um Verständnis des Codes? Sei wenigstens so konsequent und ersetze dann 'DayOfTheWeek' gleich durch den Formelsalat, der vermutlich dahintersteht? ;-)

Nu werd ma nich polemisch ;-) Man sollte schon verstehen, wie eine API funktioniert. DayOfTheWeek ist genauso Teil der API, wie EndOfTheWeek. Derjenige, der aber weiß, wie die API funktioniert und dass letztlich die DayOfTheWeek für die anderen Funktionen aufgerufen wird, kann dann direkt diese Funktion benutzen. Es war lediglich ein Hinweis, wie man das schmerzfrei optimieren kann, da ja bekannt ist, wie miserabel der Compiler (je nach Version) Float Results optimiert (bzw nicht).

Außerdem ist der Algorithmus:
- gib mir den Tag der Woche, wobei Montag 1 und Sonntag 7 ist und
- ziehe diesen vom Datum ab, das ergibt den letzten Sonntag,
- dann nochmal eins abziehen und ich hab den letzten Samstag

wohl kaum schwerer zu verstehen als:
- ziehe eine Woche vom Datum ab und
- gib mir davon den letzten Tag dieser Woche, das ergibt den letzten Sonntag,
- dann nochmal eins abziehen und ich hab den letzten Samstag

Uwe Raabe 23. Jul 2014 21:56

AW: Datum letzter Samstag?
 
Zitat:

Zitat von Stevie (Beitrag 1266476)
Außerdem ist der Algorithmus:
- gib mir den Tag der Woche, wobei Montag 1 und Sonntag 7 ist und
- ziehe diesen vom Datum ab, das ergibt den letzten Sonntag,
- dann nochmal eins abziehen und ich hab den letzten Samstag

wohl kaum schwerer zu verstehen als:
- ziehe eine Woche vom Datum ab und
- gib mir davon den letzten Tag dieser Woche, das ergibt den letzten Sonntag,
- dann nochmal eins abziehen und ich hab den letzten Samstag

Funktioniert leider beides nicht an einem Sonntag...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 Uhr.
Seite 2 von 5     12 34     Letzte »    

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