![]() |
AW: Anzahl Monate und Anzahl Wochen seit dem 01.01.0001 ermitteln
Zitat:
Delphi-Quellcode:
/Edit: für dt>=0, da TDateTime in Delphi dämlich definiert ist
function JD(dt: TDateTime): Double;
begin JD := dt + 2415018.5; end; |
AW: Anzahl Monate und Anzahl Wochen seit dem 01.01.0001 ermitteln
Zitat:
Delphi-Quellcode:
Hast du es denn überhaupt mal damit versucht?
const
MinDateTime: TDateTime = -657434.0; { 01/01/0100 12:00:00.000 AM } MaxDateTime: TDateTime = 2958465.99999; { 12/31/9999 11:59:59.999 PM } Alternativ könntest du auch mit
Delphi-Quellcode:
arbeiten:
TTimeStamp
Delphi-Quellcode:
Da es aber Umrechnungsroutinen gibt, kannst du auch gleich
TTimeStamp = record
Time: Integer; { Number of milliseconds since midnight } Date: Integer; { One plus number of days since 1/1/0001 } end;
Delphi-Quellcode:
verwenden:
TDateTime
Delphi-Quellcode:
function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp;
function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime; |
AW: Anzahl Monate und Anzahl Wochen seit dem 01.01.0001 ermitteln
TTimeStamp.Date =
![]() |
AW: Anzahl Monate und Anzahl Wochen seit dem 01.01.0001 ermitteln
Zitat:
Danke für deine Hinweise, Uwe! Ich hatte mich zum Zeitpunkt wo ich den Thread erstellt hatte durch die Function DateToStr() täuschen lassen. Zu dem Zeitpunkt wusste ich noch nicht, dass der Wert negativ wird wenn das Datum < 30.12.1899 ist und dass das ein gültiger Wert ist. @Redeemer, Danke für deine Hilfe! Ich verwende nun folgenden Code der in etlichen Tests mit den Werten aus den Tabellen übereinzustimmen scheint:
Delphi-Quellcode:
Ich wende quasi eine Art Offset an.
li_Anzahl_Tage_vom_01_01_0001_bis_gewaehltesDatum_fuer_Monat := DaysBetween(StrToDate('01.01.0001'), Trunc(cxDateEdt_Ende_Datum.Date)) -
Trunc(DayOfTheMonth(cxDateEdt_Ende_Datum.Date)); li_Anzahl_Tage_vom_01_01_0001_bis_gewaehltesDatum_fuer_Woche := DaysBetween(StrToDate('01.01.0001'), Trunc(cxDateEdt_Ende_Datum.Date)) - Trunc(DayOfTheWeek(cxDateEdt_Ende_Datum.Date)); Interessanterweise kommen hier aber falsche Werte raus, obwohl das einfacher und logischer ausschaut:
Delphi-Quellcode:
li_Anzahl_Tage_vom_01_01_0001_bis_gewaehltesDatum_fuer_Monat := MonthsBetween(StrToDate('01.01.0001'), Trunc(cxDateEdt_Ende_Datum.Date));
li_Anzahl_Tage_vom_01_01_0001_bis_gewaehltesDatum_fuer_Woche := WeeksBetween(StrToDate('01.01.0001'), Trunc(cxDateEdt_Ende_Datum.Date)); Das Thema scheint erledigt, vielen Dank an alle! :dp: |
AW: Anzahl Monate und Anzahl Wochen seit dem 01.01.0001 ermitteln
StrToDate sollte nicht mit Konstanten verwendet werden. Sonst stellt der Benutzer in den Regionseinstellungen irgendwas ein und dann läuft das Programm nicht mehr. 'Blablabla' ist kein gültiges Datum.
Daher ja MinDateTime als ersten Parameter nehmen. |
AW: Anzahl Monate und Anzahl Wochen seit dem 01.01.0001 ermitteln
Zitat:
|
AW: Anzahl Monate und Anzahl Wochen seit dem 01.01.0001 ermitteln
Oh, Jahr 100!
Aber wenn MinDateTime = 01.01.0100, warum kann StrToDate dann ein niedrigeres als das niedrigste Ergebnis liefern? Rechnerisch ist das klar, aber das führt doch den Bezeichner MinDateTime ad absurdum. |
AW: Anzahl Monate und Anzahl Wochen seit dem 01.01.0001 ermitteln
Zitat:
|
AW: Anzahl Monate und Anzahl Wochen seit dem 01.01.0001 ermitteln
Zitat:
Art und Weise bei EMBT nachfragt... ;-) |
AW: Anzahl Monate und Anzahl Wochen seit dem 01.01.0001 ermitteln
Die Konstante gibt es allerdings schon sehr lange (mindestens seit Delphi 7). Vielleicht hat jemand bei der Berechnung die Jahreszahl nur zweistellig eingegeben und die folgenden Nullen übersehen. Irgendwann wurde der Fehler bemerkt und der Kommentar entsprechend angepasst. Damit bleibt man abwärtskompatibel und es ist kein Fehler mehr, sondern as designed.
Innerhalb System.SysUtils wird die Konstante nur in TryFloatToDateTime verwendet. Das beschränkt ihren Einfluss doch auf ein überschaubares Gebiet. Interessanterweise wird die gleiche Konstante (mit dem selben Wert!) auch in FireDAC.Phys.PGWrapper deklariert (obwohl dort bereits System.SysUtils in der uses steht). Ob das Absicht oder Versehen ist, kann ich nicht beurteilen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 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-2025 by Thomas Breitkreuz