# LTIME\_TO\_UTC

**URL:** <https://oscat.discourse.group/t/ltime-to-utc/650>\
**Category:** Bestehende Module / Existing Modules\
**Created:** [2. August 2009 um 16:49 UTC](https://oscat.discourse.group/t/ltime-to-utc/650 "2009-08-02T16:49:08Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [2. August 2009 um 16:49 UTC](https://oscat.discourse.group/t/ltime-to-utc/650/1 "2009-08-02T16:49:08Z")

</div>

Hallo, ich habe folgendes Problem.

Mit SysRTCGetTime hole ich mir die aktuelle Lokalzeit, diese möchte ich dann mit LTIME\_TO\_UTC umwandeln in UTC. DST ist natürlich im Moment gesetzt. Als Ergebnis erhalte ich aber LTIME = UTC. Ist nach der Deklaration in der LIB meines Erachtens nach auch logisch. Oder habe ich da einen Denkfehler.

tmp := time\_zone\_offset \* 60 - BOOL\_TO\_INT(DST)_3600; /_\* In Deutschland 60 min Offset - 60 min DST ergibt doch 0, laut der Beschreibung müsste aber -120 rauskommen, oder??? Müsste der Offset nicht eine negative Zahl sein??

Vielen Dank im Voraus.

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [2. August 2009 um 18:51 UTC](https://oscat.discourse.group/t/ltime-to-utc/650/2 "2009-08-02T18:51:12Z")

</div>

Hallo Terminator95

Dein Problem mit LTIME\_TO\_UTC kann ich nachvollziehen !

Ich habe dir eine korrigierte version erstellt !

die alte hat nicht nur falsch gerechnet, sondern hat auch bei “DST” = True , das ganze jahr über die +1 Stunde für Sommerzeit mitgerechnet  
die neue version prüft vorher ob bei LTIME überhaupt sommerzeit aktiv ist

und nicht vergessen time\_offset wird in minuten angegeben

```auto
FUNCTION LTIME_TO_UTC : DT
VAR_INPUT
	LTIME : DT;
	DST_ENABLE : BOOL;
	TIME_ZONE_OFFSET : INT;
END_VAR
VAR
	tmp: INT;
	tmp2: DWORD;
END_VAR

tmp := time_zone_offset * 60;
tmp2 := BOOL_TO_DWORD(DST_ENABLE AND DST(LTIME)) * 3600;
IF tmp < 0 THEN
	tmp := ABS(tmp);
	LTIME_TO_UTC := DWORD_TO_DT(DT_TO_DWORD(Ltime) + INT_TO_DWORD(tmp) - tmp2);
ELSE
	LTIME_TO_UTC := DWORD_TO_DT(DT_TO_DWORD(Ltime) - INT_TO_DWORD(tmp) - tmp2);
END_IF;

```

Hallo,

ich hab noch was zum Thema beizurtagen, auch wenn es schon etwas älter ist. Hatte nämlich eben selbiges Problem:

Wozu der Aufwand, den halben Baustein umzuschreiben? Eigentlich hätte es doch gereicht in der ersten Zeile das Minus durch ein Plus zu ersetzen, so dass es so aussieht  
Code:

tmp := time\_zone\_offset \* 60 + BOOL\_TO\_INT(DST)\*3600;

Habs gerade ausprobiert, sollte auch funktionieren. Jetzt werden nämlich im Sommer richtigerweise 2h und im Winter 1h von der Systemzeit abgezogen (wenn man sich in Deutschland befindet).

Wär natürlich klasse, wenn es in der nächsten Release aufgenommen wird. Ich vermute, es ist in der 3.10 schlicht vergessen worden Wink

Gruß  
Thomas

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [3. August 2009 um 06:58 UTC](https://oscat.discourse.group/t/ltime-to-utc/650/3 "2009-08-03T06:58:16Z")

</div>

super, vielen Dank. Jetzt habe ich nur noch das Problem, dass Codesys auf einmal den Baustein DST als nicht gültigen Baustein anmeckert. Wie kriege ich das jetzt wieder hingebogen? Ich glaube, ich muss mich mal tiefer mit dem Ganzen auseinandersetzen. CFC reicht irgendwann nicht mehr. 🙂

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [3. August 2009 um 07:18 UTC](https://oscat.discourse.group/t/ltime-to-utc/650/4 "2009-08-03T07:18:02Z")

</div>

bei der neuen version hat sich auch ein input-parameter geändert, normalerweise reicht es wenn du den baustein neu in dein programm einfügst  
oder du machst dir eine LTIME\_TO\_UTC\_2 die du dann verwendest, bis die nächste oscat-release erscheint

neuen baustein “LTIME\_TO\_UTC\_2” anlegen und diesen code verwenden

FUNCTION LTIME\_TO\_UTC\_2 : DT  
VAR\_INPUT  
LTIME : DT;  
DST\_ENABLE : BOOL;  
TIME\_ZONE\_OFFSET : INT;  
END\_VAR  
VAR  
tmp: INT;  
tmp2: DWORD;  
END\_VAR

tmp := time\_zone\_offset \* 60;  
tmp2 := BOOL\_TO\_DWORD(DST\_ENABLE AND DST(LTIME)) \* 3600;  
IF tmp \< 0 THEN  
tmp := ABS(tmp);  
LTIME\_TO\_UTC\_2 := DWORD\_TO\_DT(DT\_TO\_DWORD(Ltime) + INT\_TO\_DWORD(tmp) - tmp2);  
ELSE  
LTIME\_TO\_UTC\_2 := DWORD\_TO\_DT(DT\_TO\_DWORD(Ltime) - INT\_TO\_DWORD(tmp) - tmp2);  
END\_IF;

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/free1/uploads/oscat/original/1X/2efdfb9c592ff9a666c94dff124ee84fa863dae5.jpeg) [@system](https://oscat.discourse.group/u/system)\
**Post date:** [3. August 2009 um 08:13 UTC](https://oscat.discourse.group/t/ltime-to-utc/650/5 "2009-08-03T08:13:02Z")

</div>

Hallo Peewitt,

der Baustein an sich funktioniert schon. Auch die Inputparameter, aber der Baustein DST aus der OSCAT (den du ja auch für die Überprüfung verwendest) (AND DST(LTIME)) wird nicht mehr erkannt. Hast Du eine Idee woran das liegen kann??

* * *

ich trottel, hatte wg. dem tollen Bug mit der Bausteinbegrenzung “alle unbenutzten” Bausteine beim Übersetzen ausgeschlossen. Darum fand Codesys natürlich den DST-Baustein nicht, da vorher nicht verwendet.

Danke.

---

<div class="post-metadata">

**Author:** ![D-Platoon](https://avatars.discourse-cdn.com/v4/letter/d/ce7236/32.png) [@D-Platoon](https://oscat.discourse.group/u/D-Platoon)\
**Post date:** [4. Mai 2010 um 20:14 UTC](https://oscat.discourse.group/t/ltime-to-utc/650/6 "2010-05-04T20:14:45Z")

</div>

Hallo,

ich hab noch was zum Thema beizurtagen, auch wenn es schon etwas älter ist. Hatte nämlich eben selbiges Problem:

Wozu der Aufwand, den halben Baustein umzuschreiben? Eigentlich hätte es doch gereicht in der ersten Zeile das Minus durch ein Plus zu ersetzen, so dass es so aussieht

```auto
tmp := time_zone_offset * 60 + BOOL_TO_INT(DST)*3600;

```

Habs gerade ausprobiert, sollte auch funktionieren. Jetzt werden nämlich im Sommer richtigerweise 2h und im Winter 1h von der Systemzeit abgezogen (wenn man sich in Deutschland befindet).

Wär natürlich klasse, wenn es in der nächsten Release aufgenommen wird. Ich vermute, es ist in der 3.10 schlicht vergessen worden 😉

Gruß  
Thomas

---

<div class="post-metadata">

**Author:** ![hugo](https://yyz2.discourse-cdn.com/free1/user_avatar/oscat.discourse.group/hugo/32/133_2.png) [@hugo](https://oscat.discourse.group/u/hugo)\
**Post date:** [1. Juli 2010 um 07:11 UTC](https://oscat.discourse.group/t/ltime-to-utc/650/7 "2010-07-01T07:11:31Z")

</div>

DEN BUG WERDEN WIR NATÜRLICH VERBESSERN.

aber sinnvoller wäre es in deinem fall die interne uhr auf utc laufen zu lassen und gegebenenfalls daraus die lokalzeit zu berechnen.  
das ist immer eindeutig, logischer und weniger aufwendig
