Results 1 to 9 of 9

Thread: datums van elkaar aftrekken

  1. #1

    datums van elkaar aftrekken

    Ik gebruik helaas nog Delphi 6, maar het lukt nog altijd.
    In een bestaand programma moet ik een item toevoegen
    waarin ik twee datum van elkaar moet aftrekken.
    03-04-1900 minus 04-05-1845 = alleen het aantal jaren.
    maar ook
    06-07-1875 minus 1801 = alleen het aantal jaren.
    Weet iemand nog toevallig hoe dit in Delphi 6 uitgevoerd moet worden ?
    Bij voorbaat mijn dank.

  2. #2
    Weet niet of het werkt in delphi 6 maar je kun decode date gebruiken http://www.delphibasics.co.uk/RTL.asp?Name=DecodeDate en de jaren van elkaar aftrekken. Je hebt ook een functie DaysBetween, maar dan krijgen je het verschil in dagen en die kun je natuurlijk niet zomaar door 365 delen ivm schrikkeljaren. Wil je alleen hele jaren of ook maanden en dagen opnemen?

  3. #3
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Latere versies van Delphi hebben in ieder geval in de DateUtils unit de functie IncYear():
    Delphi Code:
    1. function IncYear(const AValue: TDateTime; const ANumberOfYears: Integer): TDateTime;
    Positive waarden voor ANumberOfYears zijn in de toekomst, negatieve waarden zijn in het verleden.
    Met YearOf() kun je alleen het jaar ophalen voor de datum waarvan je alleen het jaar wilt weten.

    Met een beetje geluk heeft Delphi 6 die functies ook, anders kun je hem zelf maken met DecodeDate en EncodeDate, dat is hoe IncYear het uiteindelijk, via een omweg, ook doet.
    TMemoryLeak.Create(Nil);

  4. #4
    Quote Originally Posted by VideoRipper View Post
    Latere versies van Delphi hebben in ieder geval in de DateUtils unit de functie IncYear().
    Schiet je natuurlijk weinig mee op als je het verschil van twee datums in jaren wilt hebben
    Eigenlijk wil je dan een DiffYear(Date1, Date2) hebben. (O, ik zie al dat je YearOf() aangeeft)

    De DateUtils heeft wel YearOf() en DayOfTheYear() (of zelfs MilliSecondOfTheYear()).
    Daarmee kun je dus dit doen:

    Delphi Code:
    1. DiffYear := YearOf(Date2) - YearOf(Date1);
    2. if MilliSecondOfTheYear(Date1) > MilliSecondOfTheYear(Date2) then Dec(DiffYear);


    Edit: Woops... Ik zie dat er ook een YearsBetween() in zit
    Die werkt gewoon met het verschil in Milliseconds gediv'd door round(CMillisPerDay * ApproxDaysPerYear)

  5. #5
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Huh... hmmm, na drie keer de topic opnieuw gelezen te hebben zie ik dat TS het verschil in jaren tussen twee data willen hebben.

    In eerste instantie las ik: "Ik heb twee data en wil alleen het jaartal van elkaar aftrekken", dus "03-04-1900" - "04-05-1845" = "03-04-0055".
    In code dus iets als: DT3 := IncYear(DT1, -YearOf(DT2));

    Natuurlijk, ik kan geen reden bedenken waarom je een jaartal van een datum af zou willen trekken, maar ik kom wel gekkere dingen tegen.
    TS vraagt dus gewoon: I := YearsBetween(DT1, DT2);
    Last edited by VideoRipper; 14-Mar-18 at 18:07.
    TMemoryLeak.Create(Nil);

  6. #6
    Senior Member ErikB's Avatar
    Join Date
    Aug 2010
    Location
    Biddinghuizen
    Posts
    509
    het ligt er ook aan of Bert de schrikkeldagen mee wil tellen, zal zeker uitmaken tussen een datum voor en na 28/29 feb.
    daarnaast : ik zie de jaartallen 1875 en 1801 in het voorbeeld. Tot hoe ver wil Bert terug, want er is ook een overgang tussen juliaanse en gregoriaanse kalender:


    De gregoriaanse kalender werd voor het eerst voorgesteld door de Napolitaanse arts Aloisius Lilius en werd overgenomen door het Concilie van Trente (1545-1563). Paus Gregorius XIII kon de kalenderhervorming pas in 1582 met de bul Inter gravissimas doorvoeren. Bij de invoering werden 10 datums overgeslagen om het begin van de lente terug te brengen naar 21 maart. De weekdagen liepen zonder onderbreking door: op donderdag 4 oktober 1582 volgde vrijdag 15 oktober 1582
    (uit Wikipedia)
    Erik

  7. #7
    Ja, de MilliSecondOfTheYear() vergelijken om dat een jaar eraf te halen is eigenlijk ook niet goed. Want dan zou 1 april van het ene jaar best eens na 31 maart van het andere jaar kunnen vallen (als die van 31 maart een schrikkeljaar is).

    Beter is dus:
    Delphi Code:
    1. DiffYear := YearOf(Date2) - YearOf(Date1);
    2. if MilliSecondOfTheYear(Date1 - IfThen(IsInLeapYear(Date1) and (DayOfTheYear(Date1) > 31 + 28), 1, 0)) >
    3.    MilliSecondOfTheYear(Date2 - IfThen(IsInLeapYear(Date2) and (DayOfTheYear(Date2) > 31 + 28), 1, 0)) then Dec(DiffYear);
    Dit corrigeert een datum na 29 februari met 1 dag (dus alleen in leapyear) weer terug naar een 'normaal jaar'.

  8. #8
    Beste allemaal die gereageerd hebben, hartelijke dank hiervoor. Ik zie dat DaysBetween goed genoeg werkt voor mij, dus ga ik hiermee aan de gang.

    Jammer van de ADMINISTRATOR mijn account eruit heeft gegooid zinder mij er iets van te zeggen.
    Dus waarom weet ik helaas niet.

  9. #9
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by Bert Tobe View Post
    Jammer van de ADMINISTRATOR mijn account eruit heeft gegooid zinder mij er iets van te zeggen.
    Marcel kennende verwijdert hij niet zomaar accounts.
    Sterker: jouw account is 13 jaar oud, dus ik begrijp niet helemaal wat je bedoelt.
    TMemoryLeak.Create(Nil);

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •