Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TDate enthält Uhrzeit? (https://www.delphipraxis.net/170064-tdate-enthaelt-uhrzeit.html)

bwolf 29. Aug 2012 09:39

TDate enthält Uhrzeit?
 
Hi Leute,

ich habe eine Prozedur mit einem Parameter TDate.
Dieser Prozedur übergebe ich einen TDateTime Wert.
Wenn ich nun innerhalb dieser Prozedur den TDate-Wert im Debugger anschaue, enthält dieser immernoch den Uhrzeit-Anzeil - warum ist das so?
Wenn TDate auch die Uhrzeit entält, warum gibt es dann TDate und TDateTime?

DeddyH 29. Aug 2012 09:42

AW: TDate enthält Uhrzeit?
 
Es gibt auch noch TTime, aber alle 3 sind vom Typ double.

Lemmy 29. Aug 2012 09:42

AW: TDate enthält Uhrzeit?
 
Schau mal an wie TDate definiert ist:

Delphi-Quellcode:
TDate = type TDateTime;
das ist also nur ein Alias von TDateTime. Und die Datums- und Zeittypen sind letztlich Doubles:

Delphi-Quellcode:
  TDateTime = type Double;
wobei die Zahl vor dem Komma die Tage und das nach dem Komma die Uhrzeit des angegebenen Tages darstellt.

Grüße

s.h.a.r.k 29. Aug 2012 09:42

AW: TDate enthält Uhrzeit?
 
Ich denke, dass es Vollständigkeithalber der Fall ist. TDate und TDateTime sind beide vom Typ Extended und enhalten eben auch die Zeit. Bei TDate wird aber dann wohl nur die Nachkommastelle nicht einfach abgeschnitten, sondern beibehalten. Wäre ja sonst jedes Mal ein Mehraufwand das abzuschneiden. Was jedenfalls hinter dem Komma steht ist für Methoden, die mit TDate arbeiten dann egal, denn es ist ja nur das Datum interessant und dafür sind die Stellen für dem Komma gedacht.

bwolf 29. Aug 2012 09:46

AW: TDate enthält Uhrzeit?
 
Danke für die schnellen Antworten.
Sinnig finde ich das ganze aber nicht. Wenn ich schon explizit TDate verwende, will ich wohl auch nur das Datum haben.
Ansonsten Kann ich auch immer TDateTime verwenden wenn ich mir dann eh mit Trunc nur das Datum rausholen muss.

Daniel 29. Aug 2012 09:53

AW: TDate enthält Uhrzeit?
 
Es gibt sonst auch noch die Funktion
Delphi-Quellcode:
DateOf()
. Macht nix anderes als Trunc(), verbessert aber (in meinen Augen) die Lesbarkeit des Codes, weil der Funktionsname sprechender ist.

mkinzler 29. Aug 2012 09:53

AW: TDate enthält Uhrzeit?
 
da der Typ der selbe ist, müsste der Trunc bei jedem Schriebzugriff durchgeführt werden, und nicht nur wenn die Nachkommastelln stören

Bernhard Geyer 29. Aug 2012 09:54

AW: TDate enthält Uhrzeit?
 
TDate(time) basiert auf as Windows OLE DateTime-Format:

http://www.fxcodebase.com/documents/...p/oledate.html

himitsu 29. Aug 2012 10:59

AW: TDate enthält Uhrzeit?
 
Wie schon erwähnt wurde, sind diese 3 Typen (TDateTime, TDate und TTime) intern nur Double, welche Datum und Uhrzeit enthalten können.
Diese Typen besitzen untereinander (leider) keine Konvertierungsfunktionen, welche z.B. Datum oder Zeit entfernen.
Es sind also reine Informationstypen, welche dem "Programmierer" mitteilen welche Inhalte er dafür vorgesehn hat, aber es mußt nicht nur das darin enthalten sein.

Delphi-Referenz durchsuchenTrunc/Delphi-Referenz durchsuchenDateOf oder Delphi-Referenz durchsuchenFrac/Delphi-Referenz durchsuchenTimeOf wurden nun auch schon genannt.

PS: Es gibt auch den atTimePciker, welcher Property ala .Date und .Time enthält, wo man auch glatt vergessen hatte (weiß jetzt nicht ob's inzwischen mal behoben wurde) darin auf diese Zeitbereiche einzuschränken, so daß man bei .Time auch das Date mit drin hatte. :wall:


Was man machen könnte, wären eigene Typen für die Date/Time-Behandlung (ein Double/TDateTime in einem Record), wo über Operatoren entsprechende Umwandlungen und Fehlermeldungen (z.B. beim Versuch einen TTime an einen TDate zuzuweisen) implementiert sind.

Oder man nutzt die schon fertigen Typen wie z.B.
Delphi-Quellcode:
TTimeSpan
.

Uwe Raabe 29. Aug 2012 11:30

AW: TDate enthält Uhrzeit?
 
Es gibt schon einen Unterschied. Deklariert man eine Methode á la
Delphi-Quellcode:
(var: Value: TDate)
, so kann man keinen TDateTime als Parameter übergeben, da die Typen nicht übereinstimmen.

Iwo Asnet 29. Aug 2012 12:34

AW: TDate enthält Uhrzeit?
 
Es ist schon etwas schwer, eine Begründung dafür zu liefern, das ein Wert vom Typ 'TDate' auch eine Uhrzeit enthält, ein Wert vom Typ 'TTime' auch das Datum und 'TDateTime' beides. Weiterhin ist es nicht leicht, die Existenz der drei Datentypen zu rechtfertigen, wo es einer genauso täte.

Das das so ist, scheint nun jeder begriffen zu haben, aber klar im Sinne von 'klarer Code' ist das mit Sicherheit nicht, eher das Gegenteil.

Verwirrend.

:freak:

Bummi 29. Aug 2012 13:17

AW: TDate enthält Uhrzeit?
 
Delphi-Quellcode:
type
  TDateOnly= class(TInterfacedObject)
    private
      FValue:Double;
    procedure SetValue(const Value: Double);
    Property value:Double Read Fvalue Write SetValue ;
  End;


implementation

{$R *.dfm}
procedure TDateOnly.SetValue(const Value: Double);
begin
  Fvalue := Trunc(Value);
end;



procedure TForm5.Button1Click(Sender: TObject);
var
 d:TdateOnly;
begin
   d.value := now;
   Showmessage(DateTimeToStr((d.value)));
end;

CCRDude 29. Aug 2012 13:23

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von Iwo Asnet (Beitrag 1180462)
Das das so ist, scheint nun jeder begriffen zu haben, aber klar im Sinne von 'klarer Code' ist das mit Sicherheit nicht, eher das Gegenteil.

Interessanterweise ist das für mich eben gerade ein Beispiel von klarem Code. "Eigentlich" gibt es nur ein TDateTime, um aber für einige Aufgaben zumindest deklaratorisch klarzumachen, was ein spezieller Wert enthält, wird der Name angepasst. Klar, das könnte auch über den Namen der Variablen passieren, aber sowas findet sich doch häufiger... diverse Bibliotheken definieren sich ihre eigenen Stringtypnamen, die auch "identisch" mit den normalen sind. Oder wir alle haben schonmal ne MeineUnitException = class(Exception) ohne mehr dran verwendet, oder?

Zitat:

Zitat von Iwo Asnet (Beitrag 1180462)
Es ist schon etwas schwer, eine Begründung dafür zu liefern, das ein Wert vom Typ 'TDate' auch eine Uhrzeit enthält,

Und das ist dann eben "Schuld" des Programmierers. Da ist der Wert extra schon als ''TDate'' deklariert, und der Kerl weist auch ne Uhrzeit zu... ;)

uligerhardt 29. Aug 2012 13:27

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von Iwo Asnet (Beitrag 1180462)
Es ist schon etwas schwer, eine Begründung dafür zu liefern, das ein Wert vom Typ 'TDate' auch eine Uhrzeit enthält, ein Wert vom Typ 'TTime' auch das Datum und 'TDateTime' beides. Weiterhin ist es nicht leicht, die Existenz der drei Datentypen zu rechtfertigen, wo es einer genauso täte.

Ich vermute mal, die Typen sind dafür gut, dass man im OI unterschiedliche Property-Editoren anbieten kann.

bwolf 29. Aug 2012 13:27

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1180452)
Es gibt schon einen Unterschied. Deklariert man eine Methode á la
Delphi-Quellcode:
(var: Value: TDate)
, so kann man keinen TDateTime als Parameter übergeben, da die Typen nicht übereinstimmen.


hm doch genau das funktionert ja - was mich auch dazu veranlasst hatte diesen Thread hier zu eröffnen.

Code:
procedure Test(ADate : TDate);
begin
  showmessage(DateTimeToStr(ADate));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  d : TDateTime;
begin
  d := Now;
  Test(d);
end;

uligerhardt 29. Aug 2012 13:43

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von bwolf (Beitrag 1180478)
Zitat:

Zitat von Uwe Raabe (Beitrag 1180452)
Es gibt schon einen Unterschied. Deklariert man eine Methode á la
Delphi-Quellcode:
(var: Value: TDate)
, so kann man keinen TDateTime als Parameter übergeben, da die Typen nicht übereinstimmen.


hm doch genau das funktionert ja - was mich auch dazu veranlasst hatte diesen Thread hier zu eröffnen.

Code:
procedure Test(ADate : TDate);
begin
  showmessage(DateTimeToStr(ADate));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  d : TDateTime;
begin
  d := Now;
  Test(d);
end;

Du hast das
Delphi-Quellcode:
var
vor Value übersehen. (Den Doppelpunkt darfst du gerne weglassen. :mrgreen:)

Furtbichler 29. Aug 2012 18:20

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von CCRDude (Beitrag 1180475)
Interessanterweise ist das für mich eben gerade ein Beispiel von klarem Code.

Also in meinen Augen sollte ein Datentyp mit dem Namen 'TDate' ein Datum enthalten, sonst nichts. Analog sollte ein 'TTime' eine Uhrzeit repräsentieren. Alles andere ist verwirrend.

Nach deiner Sichtweise könnten wir auch mit einem einzigen Zahlentyp aufwarten: 'TNumber', denn es ist ja die Schuld des Programmierers, wenn der Code dadurch nicht klar genug ist. Ich kann deine Sichtweise nachvollziehen, aber die Schlußfolgerung ist imho falsch.

Zitat:

Zitat von CCRDude (Beitrag 1180475)
diverse Bibliotheken definieren sich ihre eigenen Stringtypnamen, die auch "identisch" mit den normalen sind. Oder wir alle haben schonmal ne MeineUnitException = class(Exception) ohne mehr dran verwendet, oder?

Diese Datentypen sind ja auch von der Bedeutung her identisch
Zitat:

Und das ist dann eben "Schuld" des Programmierers. Da ist der Wert extra schon als ''TDate'' deklariert, und der Kerl weist auch ne Uhrzeit zu... ;)
Unglaublich. Bei richtigen Programmiersprachen meckert hier der Compiler. Merkste was? ;-)


Ich verlange von meinen Datentypnamen, das das draufsteht, was drin ist. Nicht mehr und nicht weniger.

TDate, TTime und TDateTime sollten nicht zuweisungskompatibel sein, denn ein TDateTime ist genaugenommen ein genauer Zeitpunkt (innerhalb der bekannten Grenzen), während ein TDate einfach nur ein Datum und TTime nur eine Zeit darstellen sollte.

Desweiteren ist bei diesem Datentyp nicht zu vermitteln, wie die Differenz zwischen zwei Zeitpunkten wieder ein Zeitpunkt sein kann, das ist bescheuert und schlicht und ergreifend falsch. Genauso hirnrissig wie z.B. die Differenz zwischen zwei Temperaturangaben wieder als Temperatur anzugeben. Zwischen 5°C und 20°C liegen eben nicht 15°C sondern 15 K.

Delphi halt. Pragmatik und zum-frickeln-einladend-praktisch kommt vor OOP. Das macht den jedoch Charme der Sprache aus.

jfheins 29. Aug 2012 18:31

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von Furtbichler (Beitrag 1180549)
Desweiteren ist bei diesem Datentyp nicht zu vermitteln, wie die Differenz zwischen zwei Zeitpunkten wieder ein Zeitpunkt sein kann, das ist bescheuert und schlicht und ergreifend falsch.

Ja, daher gibt es in anderen Programmiersprachen ja auch einen TimeSpan-Typ. Übrigens auch in Delphi :mrgreen:
Zitat:

Genauso hirnrissig wie z.B. die Differenz zwischen zwei Temperaturangaben wieder als Temperatur anzugeben. Zwischen 5°C und 20°C liegen eben nicht 15°C sondern 15 K.
Da kann ich dir aber nicht Recht geben. Auf quasi jeder Skala (inkl. Temperatur) ergibt die Differenz zweier Werte wieder einen Wert mit der gleichen Einheit. 10m minus 2m sind eben 8m.
Genau so ist eine Differenz von 15°C gleich einer Differenz von 15K, die Einheiten sind ja gleich groß. Ich habe jetzt schon ein paar Minuten nachgedacht und die Zeit ist die einzige Skala, wo so markant zwischen Zeitpunkten und Zeiträumen unterschieden wird...

Furtbichler 29. Aug 2012 18:40

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von jfheins (Beitrag 1180550)
Ja, daher gibt es in anderen Programmiersprachen ja auch einen TimeSpan-Typ. Übrigens auch in Delphi :mrgreen:

Toll, seit wann? Hab nur BDS2006. Und dann ist die Differenz zwischen zwei TDateTime-Werten .... doch wieder ein TDateTime :mrgreen:

Zitat:

Zitat von jfheins (Beitrag 1180550)
Da kann ich dir aber nicht Recht geben.

Solltest Du aber:
http://de.wikipedia.org/wiki/Grad_Celsius

Zitat:

Ich habe jetzt schon ein paar Minuten nachgedacht...
Gib Dir ein wenig mehr Zeit.

Nachtrag:
Zitat:

Zitat von jfheins (Beitrag 1180550)
die Zeit ist die einzige Skala, wo so markant zwischen Zeitpunkten und Zeiträumen unterschieden wird...

Nachdem ich kurz nachgedacht habe, fallen mir noch z.B. "Orte" ein. Das ist zwar ein mehrdimensionaler Wert, aber die Differenz zweier Orte (im Raum), aka Entfernung wäre ein weiteres Beispiel.

jfheins 29. Aug 2012 19:19

AW: TDate enthält Uhrzeit?
 
Ich zitiere mal aus dem Link:
Zitat:

Als Einheit für Temperaturdifferenzen wird das Kelvin [...] empfohlen, [...] darf die Differenz zweier Celsius-Temperaturen auch in der Einheit Grad Celsius (°C) angegeben werden.
Das klingt jetzt nicht besonders eindeutig.

Das mit der Entfernung ist so ne Sache. Wenn ich sage "Fulda ist 100km entfernt und Würzburg 200km" dann hat die Differenz auch wieder die Einheit km.
In C# gibt es ja Point und Size und ich habe da auch schon ein paar Mal konvertiert - vornehmlich von Size zu Point ;)

Furtbichler 29. Aug 2012 21:58

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von jfheins (Beitrag 1180555)
Das klingt jetzt nicht besonders eindeutig.

Ich habe es in der Schule so gelernt, aber im Artikel steht, das die Einheit °C als Differenz auch akzeptabel ist: Also gibst Du mir doch Recht und liegst gleichzeitig auch nicht daneben. Da freuen wir uns jetzt.

Die Angabe von Orten wird nicht in Längeneinheiten angegeben, ihre Entfernung schon.
Bei der Zeit, die ja auch eine Dimension ist, unterscheiden wir auch zwischen dem Zeitpunkt (=fester Ort) und dem Abstand (=Entfernung), beide Angaben werden mit unterschiedlichen Einheiten angegeben, was logisch ist, denn die Orte sind mehrdimensional, deren Entfernung jedoch nicht.

Den Rest deiner Ausführungen (Point, Size, Entfernung) verstehe ich nicht.

Uwe Raabe 30. Aug 2012 09:27

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von Furtbichler (Beitrag 1180562)
Die Angabe von Orten wird nicht in Längeneinheiten angegeben, ihre Entfernung schon.
Bei der Zeit, die ja auch eine Dimension ist, unterscheiden wir auch zwischen dem Zeitpunkt (=fester Ort) und dem Abstand (=Entfernung), beide Angaben werden mit unterschiedlichen Einheiten angegeben, was logisch ist, denn die Orte sind mehrdimensional, deren Entfernung jedoch nicht.

Wenn du die Entfernung zwischen zwei Orten als Längenangabe verstehst, dann wendest du auf die Differenz der Ortskoordinaten eine Metrik an, die diese Differenz im jeweiligen Koordinatensysten (kartesisch, sphärisch, geodätisch) auf eine Längeneinheit abbildet. Bei eindimensionalen Systemen ist diese Metrik meistens synonym mit dem Absolutwert der Differenz. Wenn du aber bei der Differenz zweier Zeitpunkte auch negative Ergebnisse zulässt, betrachtest du eben keine Metrik, sondern die tatsächliche Differenz. Zwei verschiedene Orte B und C können zwar zu einem Ort A den gleichen Abstand haben, aber trotzdem sind die jeweiligen Differenzen unterschiedlich.

Bezogen auf das z.B. kartesische System ist die Differenz zweier Ortsvektoren (x, y, z) wiederum ein Vektor (x, y, z). Erst wenn eine Homogenisierung des Koordinatensystems durch Einführung einer vierten Koordinate (w) erfolgt, kann anhand des Inhalts eines solchen vierdimensionalen Vektors (Ort: w=1; Richtung: w=0) eine Unterscheidung erfolgen (Das FireMonkey-Koordinatensystem wie so ziemlich alle 3D-Systeme arbeiten z.B. damit; es ist aber nur ein Trick zur Vereinfachung der Rechenoperationen für den Programmierer). Ohne diese Erweiterung ist ein 3D-Vektor ein 3D-Vektor. Ein Orts-Vektor wird nur dadurch daraus, daß man ihn auf einen definierten Nullpunkt bezieht. Da es keinen (mir) bekannten absoluten Nullpunkt gibt, ist jeder Orts-Vektor auch nur ein Differenz-Vektor zu einem willkürlich gesetzten Bezugspunkt. Es gibt also keinen Unterschied zwischen Orts-Vektoren und Differenzen zwischen ihnen.

Ebenso verhält es sich mit Zeitpunkten, die auch nur Differenzen zu einem willkürlichen Zeit-Nullpunkt sind. Vielleicht erinnert sich noch einer an die Änderung des Referenzdatums zwischen Delphi 1 und späteren Delphi Versionen. In Delphi 1 war ein TDate von 0 gleichbedeutend mit dem 31.12.1899, während in neueren Delphi-Versionen irgendein Tag um die Geburt eines galiläischen Zimmermannssohns herum als Referenz herhalten muss.

Lemmy 30. Aug 2012 09:39

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1180602)
In Delphi 1 war ein TDate von 0 gleichbedeutend mit dem 31.12.1899, während in neueren Delphi-Versionen irgendein Tag um die Geburt eines galiläischen Zimmermannssohns herum als Referenz herhalten muss.


kann es sein, dass Du dich da irrst?

Zitat:

TDate repräsentiert einen speziellen Typ eines TDateTime-Werts, der keinen Dezimalanteil hat. Ein TDate-Wert repräsentiert die Anzahl der Tage, die seit dem 30.12.1899 vergangen sind.

Bjoerk 30. Aug 2012 10:13

AW: TDate enthält Uhrzeit?
 
Delphi-Quellcode:
  ShowMessage(DateTimeToStr(0));

Delphi-Quellcode:
  ShowMessage(DateTimeToStr(0 + 1/24 + 1/24/60 + 1/24/60/60));

himitsu 30. Aug 2012 10:21

AW: TDate enthält Uhrzeit?
 
Zitat:

TDate repräsentiert einen speziellen Typ eines TDateTime-Werts, der keinen Dezimalanteil hat. Ein TDate-Wert repräsentiert die Anzahl der Tage, die seit dem 30.12.1899 vergangen sind.
Laut Definition.

Wenn jemand doch eine Uhrzeit da mit reinpackt, dann hat er Pech.

Ein Briefkasten ist ja auch da, um Briefe zu kommen, was aber nicht bedeutet, daß dort niemand stattdessen einen Scheißhaufen reintun könnte.


@Bjoerk: :?:

Aber verständlicheren und fehlerunanfälligeren Code mag ich auch irgendwie lieber.
Delphi-Quellcode:
ShowMessage(DateTimeToStr(0 + EncodeTime(1, 1, 1, 0));
ShowMessage(DateTimeToStr(0 + 1/HoursPerDay + 1/MinsPerDay + 1/SecsPerDay));

Lemmy 30. Aug 2012 10:33

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von himitsu (Beitrag 1180623)
Laut Definition.

Wenn jemand doch eine Uhrzeit da mit reinpackt, dann hat er Pech.

darum gehts doch gar nicht, sondern darum welches Referenzdatum TDate/TDateTime verwendet. Und da ist in neueren Delphis eben der 31.12.1899 relevant und nicht wie Uwe schreibt das Datum von Christi Geburt. Und da Uwe sich praktisch nie irrt, fand ich das doch sehr verwunderlich ;-)

Grüße

Uwe Raabe 30. Aug 2012 10:39

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von Lemmy (Beitrag 1180605)
Zitat:

Zitat von Uwe Raabe (Beitrag 1180602)
In Delphi 1 war ein TDate von 0 gleichbedeutend mit dem 31.12.1899, während in neueren Delphi-Versionen irgendein Tag um die Geburt eines galiläischen Zimmermannssohns herum als Referenz herhalten muss.


kann es sein, dass Du dich da irrst?

Zitat:

TDate repräsentiert einen speziellen Typ eines TDateTime-Werts, der keinen Dezimalanteil hat. Ein TDate-Wert repräsentiert die Anzahl der Tage, die seit dem 30.12.1899 vergangen sind.

Stimmt! Es war genau andersherum. In Delphi 1 war der 01.01.0001 der Referenzwert, das wurde dann später auf den 31.12.1899 verändert.

himitsu 30. Aug 2012 10:39

AW: TDate enthält Uhrzeit?
 
Zitat:

31.12.1899
Ist das nicht schon immer so? (soweit ich mich an alle meines Delphis erinnern kann)

[edit]
Hab zwar ein D1 (war bei meinen 2 D4 dabei), aber hab's nie wirklich benutzt.

Bjoerk 30. Aug 2012 11:29

AW: TDate enthält Uhrzeit?
 
Zitat:

Zitat von himitsu (Beitrag 1180623)
@Bjoerk: :?: Aber verständlicheren und fehlerunanfälligeren Code mag ich auch irgendwie lieber.

Japp, ich wollte nur mal deutlich machen, wie Delphi vorgeht (Threadtitel). Ich persönlich verwende das auch so nie.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:17 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