Results 1 to 10 of 10

Thread: funciie hoe lang geleden of over hoeveel tijd

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    funciie hoe lang geleden of over hoeveel tijd

    MOCHT iemand een functie kennen/weten/hebben die 2 datetimes vergelijkt en zo'n beetje dit kan teruggeven:
    - vandaag
    - gisteren
    - morgen
    - over 3 dagen
    - over een week
    - over 3 weken
    - over 1 maand
    - over 7 maanden
    - over 1 jaar
    - over 10 jaar
    - een week geleden
    - 4 dagen geleden
    - 2 weken geleden
    - 1 maand geleden
    - 11 maanden geleden
    - 5 jaar geleden

    dan houd ik mij aangevolen :-)

    (weinig tijd...)

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Huh, je wil twee zaken vergelijken, die een vast antwoord geeft?
    • Bedoel je dat je DT2 - DT1 wilt dat een antwoord geeft in de vorm van: "12 jaar, 34 weken, 5 dagen, 6 uur, 7 minuten en 8 seconden"
    • Of wil je weten wat de DT1 + X = DT2, zoals "4 juli 2016 + 7 dagen = 11 juli 2016"?
    • Of gewoon functies als DaysBetween, HoursBetween, MinutesBetween, etc die in DateUtils staan?
    TMemoryLeak.Create(Nil);

  3. #3
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Nee de vorm 12 jaar, 34 weken, 5 dagen, 6 uur, 7 minuten en 8 seconden heb ik zelf al eens gemaakt.
    Juist een vorm die het verschil in 1 "unit" weergeeft zoals in mijn voorbeeld :-)

  4. #4
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Wat dacht je hier van. Het kan precieser, maar voor een visuele weergave zou dit kunnen goed genoeg zijn:

    Delphi Code:
    1. function DisplayDateDiff(d1,d2:TDateTime);
    2. var
    3.   dd:integer;
    4. begin
    5.   dd:=Trunc(d1)-Trunc(d2);
    6.   if dd=0 then Result:='vandaag' else
    7.   if dd<0 then
    8.     if dd=-1 then Result:='gisteren' else
    9.     if dd>-6 then Result:=Format('%d dagen geleden',[-dd]) else
    10.     if dd>-62 then Result:=Format('%d weken geleden',[-dd div 7]) else
    11.     if dd>-365 then Result:=Format('%d maanden geleden',[-dd*2 div 61]) else
    12.       Result:=Format('%d jaar geleden',[-dd div 365])
    13.   else
    14.     if dd=1 then Result:='morgen' else
    15.     if dd<6 then Result:=Format('over %d dagen',[dd]) else
    16.     if dd<62 then Result:=Format('over %d weken',[dd div 7]) else
    17.     if dd<365 then Result:=Format('over %d maand',[dd*2 div 61]) else
    18.       Result:=Format('over % jaar',[dd div 365]);
    19. end;

  5. #5
    Heb je al eens gekeken naar DaysBetween en variaties daarop?
    Onmogelijk... Is geen feit, maar een mening.

  6. #6
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Jazeker.
    EN ik denk dat de code van develyoy heel aardig in de buurt komt. Thanks!

  7. #7
    TDateTimes van elkaar aftrekken gaat mis als een van de 2 < 0 is...
    (Mogelijk irrelevant voor het probleem van de vraagsteller, maar toch.)

    Bart

  8. #8
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Hoezo als er eentje kleiner is dan 0? '0' is trouwens 1/1/1900 middernacht, en zelfs als je daar voor zit, kan je toch het verschil van de twee onderliggende kommagetallen in een nieuw kommagetal nemen? (Misschien bedoel je dat je die best niet meer als TDateTime neemt, dat klopt. Ik ontdekte trouwens recent dat PostgreSQL een interval type heeft, en als je het verschil neemt van twee timstamps, is het resultaat vanzelf al een interval!)
    Mocht het je zijn opgevallen, ik doe er twee keer Trunc, specifiek om er voor te zorgen dat bijvoorbeeld tussen een voormiddag en een namiddag niet onterecht een extra dag wordt meegerekend...

  9. #9
    Quote Originally Posted by develyoy View Post
    '0' is trouwens 1/1/1900 middernacht...
    Uh... 0 in een TDateTime is volgens mij (en Embarcadero) 30-12-1899 00:00.
    http://docs.embarcadero.com/products...TDateTime.html

    Heeft er geloof ik mee te maken dat Lotus 123 vroeger een bug had die dacht dat 1900 een schrikkeljaar was (wat het niet was).

  10. #10
    Quote Originally Posted by develyoy View Post
    Hoezo als er eentje kleiner is dan 0?
    Sorry, niet helemaal accuraat.
    Het heeft te maken met hoe TDateTime is gedefinieerd.
    Zie http://docwiki.embarcadero.com/Libra...stem.TDateTime

    When working with negative TDateTime values, computations must handle time portion separately. The fractional part reflects the fraction of a 24-hour day without regard to the sign of the TDateTime value. For example, 6:00 A.M. on December 29, 1899 is –1.25, not –1 + 0.25, which would equal –0.75. There are no TDateTime values from –1 through 0.
    Kortom er is soms compensatie nodig als je 2 TDateTimes van elkaar aftrekt.
    Onderstaand code fragment is uit fpc (en dus GPL).

    Code:
    Function DateTimeDiff(const ANow, AThen: TDateTime): TDateTime;
    begin
      Result:= ANow - AThen;
      if (ANow>0) and (AThen<0) then
        Result:=Result-0.5
      else if (ANow<-1.0) and (AThen>-1.0) then
        Result:=Result+0.5;
    end;
    Bart

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
  •