![]() |
Delphi-Version: 7
Datum letzter Samstag?
Hallo,
wie finde ich das Datum vom letzten Samstag? Gibt's da vllt eine Funktion oder muss ich da selber rechnen? Thx |
AW: Datum letzter Samstag?
Delphi-Quellcode:
function LastSaturday(const AVAlue: TDateTime): TDateTime;
asm add esp,-$14 push dword ptr [ebp+$0c] push dword ptr [ebp+$08] call DayOfTheWeek movzx eax,ax inc eax neg eax mov [ebp-$14],eax fild dword ptr [ebp-$14] fadd qword ptr [ebp+$08] fstp qword ptr [ebp-$10] wait mov eax,[ebp-$10] mov [ebp-$08],eax mov eax,[ebp-$0c] mov [ebp-$04],eax fld qword ptr [ebp-$08] mov esp,ebp pop ebp ret $0008 end; |
AW: Datum letzter Samstag?
Delphi-Quellcode:
result := Date - DayOfWeek(Date);
|
AW: Datum letzter Samstag?
Zitat:
wtf? |
AW: Datum letzter Samstag?
Das nenne ich mal Hardcore :thumb: 8-)
Mein Stil wäre das hier gewesen:
Delphi-Quellcode:
Mit dem TDateTimeHelper von
var
wantedMonth: TDateTime; dayIterator: TDateTime; begin wantedMonth := Now(); // Der aktuelle Monat dayIterator := wantedMonth.EndOfMonth(); // Letzter Tag von wantedMonth while dayIterator.DayOfWeek <> DaySaturday do dayIterator := dayIterator.AddDays(-1); WriteLn( 'Der letzte Samstag des Monats von ' +currentMonth.ToString().QuotedString() +' ist ' +dayIterator.ToString().QuotedString() ); ReadLn; end. ![]() |
AW: Datum letzter Samstag?
Zitat:
|
AW: Datum letzter Samstag?
Delphi-Quellcode:
Das kann man auch mathematisch lösen.
while dayIterator.DayOfWeek <> DaySaturday do
dayIterator := dayIterator.AddDays(-1); ![]() ![]() Und nun braucht man nur noch die nötige Differenz zum gewünschten Samstag berechnen, also anhand dessen Wert für DayOfWeek/DayOfTheWeek. Ergibt dann (glaub ich)
Delphi-Quellcode:
, bzw. gekürzt das bereits erwähnte
Result := Date - (DayOfWeek(Date) + 0{DayOfWeek für Samstag} + DaysOfWeek) mod DaysOfWeek;
Delphi-Quellcode:
.
Result := Date - DayOfWeek(Date);
|
AW: Datum letzter Samstag?
Ich find meine Lösung am besten.. Ist ein "Einzeiler" (keine Schleife notwendig) :P
|
AW: Datum letzter Samstag?
Delphi-Quellcode:
liefert den 18.07.2014...
function LastSaturday(const AVAlue: TDateTime): TDateTime;
asm add esp,-$14 push dword ptr [ebp+$0c] push dword ptr [ebp+$08] call [B]DayOfWeek[/B] //DayOfTheWeek gibts nicht movzx eax,ax inc eax neg eax mov [ebp-$14],eax fild dword ptr [ebp-$14] fadd qword ptr [ebp+$08] fstp qword ptr [ebp-$10] wait mov eax,[ebp-$10] mov [ebp-$08],eax mov eax,[ebp-$0c] mov [ebp-$04],eax fld qword ptr [ebp-$08] mov esp,ebp pop ebp ret $0008 end; procedure TForm7.FormCreate(Sender: TObject); begin ShowMessage(DateToStr(LastSaturday(Date))); end;
Delphi-Quellcode:
liefert den 19.07.2014...
ShowMessage(DateToStr(Date-DayOfWeek(Date)));
Jetzt kann sich jeder überlegen was stimmt ;-) |
AW: Datum letzter Samstag?
Zitat:
|
AW: Datum letzter Samstag?
![]() Zitat:
|
AW: Datum letzter Samstag?
Jupp, drumm hatte ich auch beide Funktionen erwähnt und verlinkt.
Zitat:
|
AW: Datum letzter Samstag?
Aus der OH:
Zitat:
Gruß K-H |
AW: Datum letzter Samstag?
Off-By-One Fehler.. na und :P
Edit: Tut im Grunde genau #3 hab mich nur um "1" vertan |
AW: Datum letzter Samstag?
Zitat:
So schön, minimalistisch und elegant Uwes Lösung auch ist, ich würde vielleicht doch eine Schleife bevorzugen:
Delphi-Quellcode:
Hier ist es vollkommen egal, was DayOfWeek liefert (enum, integer, string etc.) Die Version läuft immer und überall (solange es Samstage gibt).
Function LastSaturday(Date : TDateTime) : TDateTime;
Const DaySaturday = 7; Begin Result := Date - 1; While DayOfWeek(Result) <> DaySaturday do Result := Result - 1; End; Alternative: ISO-8601-Routine verwenden;
Delphi-Quellcode:
Laut ISO ist der letzte Tag der Woche der Sonntag. Und die ISO ändert sich nicht, außer bei Übernahme durch Außerirdische/Nordkorea.
function LastSaturday (aDate : TDateTime) : TDateTime;
Var LastSunday : TDateTime; Begin LastSunday := EndOfTheWeek(aDate-7); Result := LastSunday - 1; End; |
AW: Datum letzter Samstag?
Zitat:
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:
Dann doch lieber gleich:
Delphi-Quellcode:
function LastSaturday(aDate: TDateTime): TDateTime;
begin Result := aDate - DayOfTheWeek(aDate) - 1; end; |
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 |
AW: Datum letzter Samstag?
Zitat:
Zitat:
|
AW: Datum letzter Samstag?
Zitat:
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 |
AW: Datum letzter Samstag?
Zitat:
|
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! |
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. |
AW: Datum letzter Samstag?
Zitat:
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 :) |
AW: Datum letzter Samstag?
Zitat:
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... |
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. ![]() Egal welcher Wert für Samstag zurückgegeben wird, dieser Wert ist gleich dem Wert der Konstanten
Delphi-Quellcode:
.
DaySaturday
Delphi-Quellcode:
Ich halte es aber für sehr unwahrscheinlich, dass sich die eine oder andere Funktion ändern wird :)
uses DateUtils;
Function LastSaturday(Date : TDateTime) : TDateTime; Begin Result := Date - 1; While DayOfTheWeek(Result) <> DaySaturday do Result := Result - 1; End; |
AW: Datum letzter Samstag?
Zitat:
Und gleichzeitig wird die Formel dann für alle Wochentage funktionieren. (wenn man nicht die speziell, für den Samstag, gekürzte Version verwendet) |
AW: Datum letzter Samstag?
Noch ein Vorschlag ohne Schleife.
Delphi-Quellcode:
LastDow(Date, DayFriday) sollte dann den 18.7. ergeben.
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; |
AW: Datum letzter Samstag?
Zitat:
|
AW: Datum letzter Samstag?
Zitat:
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. |
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.
|
AW: Datum letzter Samstag?
Zitat:
|
AW: Datum letzter Samstag?
Zitat:
Es sollte auch Unittests zu Posts geben. :oops: Zitat:
|
AW: Datum letzter Samstag?
Wow... das ist ja fast wie die Relativitätstheorie. :roteyes:
Und letzter Sonntag wäre dann?
Delphi-Quellcode:
result := Date - DayOfWeek(Date) + 1;
|
AW: Datum letzter Samstag?
Zitat:
|
AW: Datum letzter Samstag?
Zitat:
Delphi-Quellcode:
Function LastDow (const DateToMatch : TDateTime; const DowToMatch : Byte) : TDateTime;
begin result := ( DateToMatch - 1 ) - ((DaysPerWeek - DowToMatch + DayOfTheWeek( DateToMatch - 1 )) mod DaysPerWeek); end; |
AW: Datum letzter Samstag?
Zitat:
|
AW: Datum letzter Samstag?
Zitat:
Zitat:
Delphi-Quellcode:
Und schon würde es bestimmt gut ins DateUtils rein passen.
function LastDow(DowToMatch: Word{selber Typ wie DayOfTheWeek ... k.A. warum es eventuell mehr als 255 Wochentage geben könnte}; DateToMatch: TDate=0; Weeks: Integer=-1): TDateTime;
begin if DateToMatch = 0 then DateToMatch = Date; Result := (DateToMatch - 1) - ((DaysPerWeek - DowToMatch + DayOfTheWeek(DateToMatch - 1)) mod DaysPerWeek) + (Weeks + 1) * DaysPerWeek; end; function NextDow(DowToMatch: Word; DateToMatch: TDate=0; Weeks: Integer=+1): ... // NextDow ist ja nicht einfach nur (LastDow + DaysPerWeek), jedenfalls nicht, falls das DateToMatch zufällig bereits der DowToMatch wäre. |
AW: Datum letzter Samstag?
Möchte jemand die Behandlung jetzt noch auf verschiedene Zeitzonen erweitern?
|
AW: Datum letzter Samstag?
Zitat:
|
AW: Datum letzter Samstag?
Zitat:
Aber wie wär es hier mit: London 7.00 Sonntag Vormittag welcher Wochentag ist in Wellington Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr. |
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 by Thomas Breitkreuz