AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi HoursBetween OHNE SysUtils und DateUtils ?
Thema durchsuchen
Ansicht
Themen-Optionen

HoursBetween OHNE SysUtils und DateUtils ?

Ein Thema von TN0 · begonnen am 1. Sep 2006 · letzter Beitrag vom 6. Okt 2010
Antwort Antwort
TN0

Registriert seit: 27. Sep 2005
Ort: NRW
7 Beiträge
 
Delphi 5 Enterprise
 
#1

HoursBetween OHNE SysUtils und DateUtils ?

  Alt 1. Sep 2006, 12:10
Juten Tach alle miteinander,

ich hab wohl ein kleines Denkproblem und hoffe, dass mir hier jemand auf die Sprünge helfen kann.

Also, ich möchte die Differenz in Stunden errechnen, wobei ein Datums-/Zeitwert nur als String vorhanden ist (31.08.2006 12:01). Und den anderen Wert hole ich mir mit "GetLocalTime(SystemTime);".
Ich möchte - wenn überhaupt möglich - nicht die "SysUtils.pas" verwenden. Die "DateUtils.pas" hab ich sowieso nicht, da ich im Moment nur mit Delphi5 arbeite.

Delphi-Quellcode:
Function HoursBetween(Time1, Time2 : TDateTime) : Double;
Begin
  result := Time2 - Time1 * 24;
End;
Ich hab diese Funktion "HoursBetween" schon im Internet gefunden, aber das umwandeln des Strings in TDateTime und das umwandeln der SystemTime in TDateTime fällt mir schwer.
Hat da einer eine Idee und könnte mir weiterhelfen ?


mfg
TNO
Ich würde ja gerne die Welt verändern, aber G.O.T.T. will mir einfach nicht den Quelltext geben.
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

Re: HoursBetween OHNE SysUtils und DateUtils ?

  Alt 1. Sep 2006, 12:24
Zitat von TN0:
Ich möchte - wenn überhaupt möglich - nicht die "SysUtils.pas" verwenden. Die "DateUtils.pas" hab ich sowieso nicht, da ich im Moment nur mit Delphi5 arbeite.
Ich verstehe überhaupt nicht, warum Du diese Dateien nicht verwenden willst. Genau dafür hat Borland Dir die Arbeit abgenommen und dafür gesorgt, dass Du mit 'uses SysUtils' z.B. die Funktion Delphi-Referenz durchsuchenStrToDateTime nutzen kannst.

Aber wenn Du partout 'ohne' arbeiten willst, dann kannst Du Dir im Quelltext anschauen und kopieren, wie Borland es erledigt hat.

Außerdem läuft zz. die Diskussion Hier im Forum suchenzeitinterval in stunden berechnen.

Gruß Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
TN0

Registriert seit: 27. Sep 2005
Ort: NRW
7 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: HoursBetween OHNE SysUtils und DateUtils ?

  Alt 1. Sep 2006, 13:07
Zitat:
Ich verstehe überhaupt nicht, warum Du diese Dateien nicht verwenden willst. Genau dafür hat Borland Dir die Arbeit abgenommen und dafür gesorgt, dass Du mit 'uses SysUtils' z.B. die Funktion StrToDateTime nutzen kannst.
Mir ist das schon klar, dass mir Borland dabei die Arbeit abnimmt, wenn ich die Sysutils benutze.
Aber ich würd gerne mal versuchen das so zu lösen, weil ich auch mal selber dahinter kommen möchte.
Vorgekaute Funktionen einfach immer nur zu implementieren find ich persönlich langweilig. Ich benutze auch kaum Komponenten, denn etwas zu Fuß zu lösen regt das Gehirn an.

Ich sehe keinerlei Schwierigkeit bei der umsetzung meines Problems, wenn ich die SysUtils benutze.
Aber warum einfach, wenn es auch kompliziert geht.

Zitat:
Aber wenn Du partout 'ohne' arbeiten willst, dann kannst Du Dir im Quelltext anschauen und kopieren, wie Borland es erledigt hat.
Hui, naja ist auch nix anderes als ne vorgekaute Funktion zu übernehmen.

Also nicht falsch verstehen, ich will nicht, dass mir hier jemand fertigen Quelltext anbietet. Ich brauche nur Denkhilfe sowas zu lösen.


mfg
TNO
Ich würde ja gerne die Welt verändern, aber G.O.T.T. will mir einfach nicht den Quelltext geben.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: HoursBetween OHNE SysUtils und DateUtils ?

  Alt 1. Sep 2006, 13:09
Zitat von Jürgen Thomas:
Ich verstehe überhaupt nicht, warum Du diese Dateien nicht verwenden willst.
Wahrscheinlich weil er NonVCL programmieren will. Wobei er hiermit eher zeigt, dass er fast "NonRTL" programmiert, da nur noch die Grundfunktionen über die System.pas enthalten sind.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: HoursBetween OHNE SysUtils und DateUtils ?

  Alt 1. Sep 2006, 13:31
Delphi-Quellcode:
typedef struct _SYSTEMTIME
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
}
 SYSTEMTIME;
Du nimmst dein Datum als String und schreibst dir eine Konvertierungsfunktion auf die obige Struktur.
Dann mit SystemTimeToFileTime in eine FILETIME-Struktur umwandeln.
Das gleiche mit deiner localen Zeit (GetLocalTime)
Die beiden FILETIME-Strukturen sind nichts anderes als ein INT64.
Diese beiden Werte voneinander abziehen.
Du erhälst das Ergebnis in 100ns Intervallen.
Dividieren durch 10*1000*1000 ergibt den Zeitunterschied in Sekunden.
Andreas
  Mit Zitat antworten Zitat
TN0

Registriert seit: 27. Sep 2005
Ort: NRW
7 Beiträge
 
Delphi 5 Enterprise
 
#6

Re: HoursBetween OHNE SysUtils und DateUtils ?

  Alt 1. Sep 2006, 13:43
Zitat:
Du nimmst dein Datum als String und schreibst dir eine Konvertierungsfunktion auf die obige Struktur.
Dann mit SystemTimeToFileTime in eine FILETIME-Struktur umwandeln.
Das gleiche mit deiner localen Zeit (GetLocalTime)
Die beiden FILETIME-Strukturen sind nichts anderes als ein INT64.
Diese beiden Werte voneinander abziehen.
Du erhälst das Ergebnis in 100ns Intervallen.
Dividieren durch 10*1000*1000 ergibt den Zeitunterschied in Sekunden.
Vielen Dank shmia !!!
Das ist genau der Denkansatz den ich brauchte.
Ich bastel mir das zuhause mal fertig und dann poste ich den Quelltext.


mfg
TNO
Ich würde ja gerne die Welt verändern, aber G.O.T.T. will mir einfach nicht den Quelltext geben.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: HoursBetween OHNE SysUtils und DateUtils ?

  Alt 6. Okt 2010, 11:22
Hallo,

das Thema ist zwar schon etwas älter aber ich möchte es dennoch erneut aufgreifen:
Auch ich möchte möglichst schlanke exe-Files und daher auf SysUtils verzichten. Dabei gehört die Eingangsfrage vermutlich zu den einfacheren Übungen. Den Quelltext hat der Verfasser nicht mehr gepostet. Hier mal meine Funktion für SecondsBetween:
Delphi-Quellcode:
// Ermittelt die Sekunden zwischen zwei Zeitpunkten
Function SecondsBetween(const ANow, AThen: TDateTime): Int64;
Const
  SecondsADay = 86400;
Begin
  If ANow < AThen Then
    Result:=Trunc(SecondsADay * (AThen - ANow))
  Else
    Result:=Trunc(SecondsADay * (ANow - AThen));
End;
TDateTime muss natürlich noch deklariert werden. HoursBetween sollte ähnlich aussehen.

Ich habe jetzt bereits eine der größeren Suchmaschinen längere Zeit bemüht, finde aber keine Antwort auf mein Problem:
Ich möchte gern - ebenfalls ohne SysUtils - Daten in eine Log-Datei schreiben. Vor den Zeilen sollen jeweils Datum und Uhrzeit stehen. Mir ist es also egal, ob ich an das Datum über TDateTime oder sonstwie heran komme. Wichtig ist mir nur der Verzicht auf SysUtils; und natürlich auf andere große Units.

Hat dazu jemand eine Idee?
Soll ich ein neues Thema aufmachen?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: HoursBetween OHNE SysUtils und DateUtils ?

  Alt 6. Okt 2010, 11:24
Was ist mit den alten Pascal Routinen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: HoursBetween OHNE SysUtils und DateUtils ?

  Alt 6. Okt 2010, 13:08
Was ist mit den alten Pascal Routinen?
Asche auf mein Haupt: Die fallen mir nicht mehr ein. Wir hatten Pascal in der Schule. Das ist bei mir 15 Jahre her. Aber Du könntest ja mal bitte nachhelfen ...

Ich habe aber für mich eine Lösung in Form von procedure GetLocalTime(var lpSystemTime: TSystemTime); gefunden. Im Record habe ich alles schön separiert, was auch das Umrechnen einfach gestaltet. InToStr ist klein und lässt sich aus SysUtils übernehmen.

Danke für die Nachricht.

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: HoursBetween OHNE SysUtils und DateUtils ?

  Alt 6. Okt 2010, 15:35
In der WindowsUnit sollten Funktionen zu finden sein, womit du dein TDateTime oder zumindetens TFileTime nach TSystemTime konvertieren kannst.
(der Umweg über die SystemTime-Struktur erspart dir das Datum selber zu zerlegen)
Mit Delphi-Referenz durchsuchenStr und Delphi-Referenz durchsuchenVal kannst du dann einzelne Zahlen nach Strings und zurück konvertieren.

Und schon kannst du dir daraus eine eigene Funktion erstellen, welche TDateTime nach String konvertiert.

[edit]
ups, hatte shmia überscrollt

[edit]
Zitat:
Delphi-Quellcode:
Function HoursBetween(Time1, Time2 : TDateTime) : Double;
Begin
  result := Time2 - Time1 * 24;
End;
und hat noch keiner bemerkt, daß diese Funktion einen kleine Schönheitsfehler hat?
(fehlende Klammern)
$2B or not $2B

Geändert von himitsu ( 6. Okt 2010 um 15:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 Uhr.
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