Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TDateTime Rechnungen über 0 ('30.12.1899 00:00') (https://www.delphipraxis.net/184178-tdatetime-rechnungen-ueber-0-30-12-1899-00-00-a.html)

SebastianZ 5. Mär 2015 11:05

Delphi-Version: XE7

TDateTime Rechnungen über 0 ('30.12.1899 00:00')
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,

ich bin über eine interessante Eigenheit vom des TDateTime - Formats gestoßen:

Wenn ein Datum < '30.12.1899' , also intern 0 ist, verhält sich der Wert des Datums gespiegelt zu den Werten > 0 (Wie auch in der Dokumentation beschrieben)
Was zur Folge hat das, vom Datum her -0,5 = 0,5 = '30.12.1899 12:00' ist.

Für mich ist der Umstand das es hier gespiegelt und nicht chronologisch im Datumsformat weiter geht unlogisch und führt bei Rechenoperationen die den 0 - Wert über bzw unterschreiten zu Problemen (Wenn vom '31.12.1899 00:00' 1,5 Tage abgezogen werden, kommt der '30.12.1899 12:00' heraus)

Wie ist hier, eurer Meinung nach, der korrekte Weg um solche Berechnungen richtig abzubilden?

PS.: Im Anhang ist ein kleines Test - Projekt, mit dem Konvertierungen zwischen Float und Datetime durchgeführt werden, damit wird auch relativ schnell sichtlich, dass -0,5 und +0,5 in TDatetime das "selbe" sind.

Der schöne Günther 5. Mär 2015 11:09

AW: TDateTime Rechnungen über 0 ('30.12.1899 00:00')
 
http://docwiki.embarcadero.com/Libra...stem.TDateTime

Zitat:

TDateTime supports negative values too. The negative spectrum mirrors the positive one exactly. As such, a value of Now (positive) is exactly the same as its negative value--Now. You should use negative TDateTime values with care. Incorrect use of negative values can lead to various problems.
Zitat:

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.

Wenn du solche wilden Datumsbereiche betrittst würde ich persönlich mir das nicht antun und ein eigenes Datumsformat und nicht TDateTime nehmen.

himitsu 5. Mär 2015 11:18

AW: TDateTime Rechnungen über 0 ('30.12.1899 00:00')
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1292440)
Wenn du solche wilden Datumsbereiche betrittst würde ich persönlich mir das nicht antun und ein eigenes Datumsformat und nicht TDateTime nehmen.

TFileTime, TSystemTime, TTimeStamp, TTimeSpan uvm.

Aber wenn man sich selber nicht mit dem Datenformat beschäftigen will/kann, dann nimmt man eben Delphi-Referenz durchsuchenIncMinute, Delphi-Referenz durchsuchenMinutesBetween, Delphi-Referenz durchsuchenDateUtils usw. :roll:

Der schöne Günther 5. Mär 2015 11:23

AW: TDateTime Rechnungen über 0 ('30.12.1899 00:00')
 
Bei der Gelegenheit noch einmal:

Zitat:

Zitat von Aphton (Beitrag 1266548)
Zitat:

Zitat von Der schöne Günther (Beitrag 1266536)
Möchte jemand die Behandlung jetzt noch auf verschiedene Zeitzonen erweitern?

Lieber nicht


hathor 5. Mär 2015 11:55

AW: TDateTime Rechnungen über 0 ('30.12.1899 00:00')
 
WINDOWS.SYSTEMTIME

https://msdn.microsoft.com/en-us/lib...or=-2147217396

wYear: The year. The valid values for this member are 1601 through 30827.


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