# Zeitumwandlung in Tage



## biGPack (27 Januar 2011)

Hi! Ich hab ein Problem mit ner Zeitspanne. Stellt euch vor ihr habt eine Tüte Milch die am 02.02.2011 abläuft. Ich will jetzt wissen wieviele Tage die Milch noch haltbar ist. Es stehen alle Zeiten zur Verfügung und auch die Entscheidung ob die Milch noch haltbar ist ist schon getroffen.

ich wollte jetzt die Zeit durch T#24h teilen um die Tage zu kriegen aber da kommt nix bei raus ausser dass Time nicht in Time konvertiert werden kann.

Habt ihr ne idee?


----------



## Larry Laffer (27 Januar 2011)

Hallo,
ja ... blöde Sache ... wieviel mm hat ein Liter ?
Vielleicht versuchst du es dann mal mit dem DATE - das ist nämlich schon in Tagen aufgelößt ...

Gruß
Larry


----------



## biGPack (27 Januar 2011)

das ist nicht das was ich brauch.
bei 24H würde mir Date sagen D#1970-01-01

mit ner while schleife ist das ding in 5 Zeilen erledigt aber die variante find ich einfach nicht elegant genug. zumal die while schleife das system blockt


----------



## StructuredTrash (27 Januar 2011)

Eine TIME-Variable enthält eine Zeitspanne in Millisekunden. Um damit arithmetische Operationen ausführen zu können, musst Du mit Typumwandlungen arbeiten (TIME_TO_UDINT und umgekehrt).


----------



## Larry Laffer (27 Januar 2011)

... das war nicht das, was ich meinte ... 

Du kannst die Date-Werte in INT wandeln (DATE_to_INT). Nun beide Werte einfach subtrahieren und du hast die Differenz in Tagen.

Gruß
Larry


----------



## biGPack (27 Januar 2011)

date1 := TIME_TO_DATE(time1);
date2 := TIME_TO_DATE(time2);

int1 := DATE_TO_INT(date1);
int2 := DATE_TO_INT(date2);

day := int2-int1;

entweder mach ich was falsch oder ich raff es nicht.

Irgendwie steh ich heut auf der Leitung


----------



## Larry Laffer (27 Januar 2011)

Also mal langsam ...
Du kannst aus dem TIME keinen sinnvollen DATE machen.
Aber ... irgendwoher kommt doch dein DATE - also der schon genannte "02.02.2011" ... und das heutige Datum ist dann ja das heutige Datum (aus der Systemuhr).
Diese beiden Werte dann in INT wandeln und subtrahieren.
Dein Code wäre also dann :
	
	



```
int1 := DATE_TO_INT(date1);
int2 := DATE_TO_INT(date2);

Anzahl_Tage := int2-int1 ;
```
...


----------



## NochEinProgrammierer (27 Januar 2011)

In der OSCAT.Lib sind einige Funktionen enthalten die mit Datums- und Zeitberechnungen befassen, vlt. ist ja DAYS_DELTA das was Du suchst?

Die OSCAT.Lib findest Du unter:
http://www.oscat.de


----------



## hugo (31 Januar 2011)

da du diese anfrage unter codesys stelltst gehe ich mal davon aus das du auch codesys benutzt.

codesys speichert die datentypen DATE und DT als 32 wert in sekunden seit 1.1.1970.
TIME und TOD wird in millisekunden als 32 Bit wert gespeichert.
Mathematische operationen sind mit diesen datentypen nur bedingt möglich.

du kannst aber alle datentypen entsprechend wandeln:
time_to_udint macht dir aus T#1s exakt den wert 1000 den du dann als udint beliebig teilen oder multiplizieren kannst.

nehmen wir nun an du möchtest die tage aus TIME berechnen dann:
tage := time_to_udint(tx) / 86400000;
ein tag hat 24*60*60 sekunden und nochmals 100 wegen den millisekunden.
das ganze mit auflösung in gleitpunktzahl wäre:
tage := time_to_real(tx) / 86400000.0;

beispiel dt in tage:
tage := dt_to_real(tx) / 86400.0;
ein tag sind 86400 sekunden

ansonsten schau dir mal die oscat an, falls du dort deine funktion nicht findest kannst du die lib öffnen und im source code schauen wie sowas funktioniert


----------

