UTC Offset ermitteln - wie geht das?
Moderator: Moderatoren
-
- ***
- Beiträge: 53
- Registriert: Mo, 27.11.2006 15:17
- Wohnort: Nürnberg
- Kontaktdaten:
UTC Offset ermitteln - wie geht das?
Hallo,
ich benötige eine Routine, welche mit den UTC Offset ermittelt. Wir haben in Deutschland bei MEZ UTC +1 und bei MESZ UTC +2.
Kann ich per Basic Makro diesen Offset ermitteln?
Greets,
Billy
OOo-Version 3.0.1
OS: M$ XP SP2
ich benötige eine Routine, welche mit den UTC Offset ermittelt. Wir haben in Deutschland bei MEZ UTC +1 und bei MESZ UTC +2.
Kann ich per Basic Makro diesen Offset ermitteln?
Greets,
Billy
OOo-Version 3.0.1
OS: M$ XP SP2
... im Prinzip ist alles einfach. Vorausgesetzt man weiss, wie's geht!
Re: UTC Offset ermitteln - wie geht das?
Hallo
Ich hab das hier unter Linux folgendermassen gebacken:
1. Ein ausführbares Shellscript 'odate.sh' in mein /home/karo/ gelegt, das bei Ausführung...
..2. eine Datei 'Zeitoffset' in /tmp schreibt, die den Offset zu UTC in der Form "+0100" enthält.
3. führe ich per Makro das unter 1. genannte Script aus, lese dann die Datei 'Zeitoffset', und lösche diese danach.
Vielleicht gibts unter Windows ja etwas ähnliches
Gruß Karo
Ich hab das hier unter Linux folgendermassen gebacken:
1. Ein ausführbares Shellscript 'odate.sh' in mein /home/karo/ gelegt, das bei Ausführung...
..2. eine Datei 'Zeitoffset' in /tmp schreibt, die den Offset zu UTC in der Form "+0100" enthält.
3. führe ich per Makro das unter 1. genannte Script aus, lese dann die Datei 'Zeitoffset', und lösche diese danach.
Code: Alles auswählen
Sub offset_UTC_lokale_Zeitzone
dim soffset as string
oService = createUNOService("com.sun.star.system.SystemShellExecute")
oservice.execute("/home/karo/odate.sh","",0)
'
'#####################################
'###odate.sh
'# /bin/date +%z > /tmp/zeitoffset
'#####################################
'date.sh erzeugt .../zeitoffset mit Inhalt:
'###########
'# +0100
'###########
'Zugriff auf ../zeitoffset:
sdatei = "/tmp/zeitoffset"
n = Freefile
open sdatei FOR Input as #n
do while not eof(#n)
line input #n, soffset
msgbox soffset '+0100
loop
close #n
'Datei löschen
kill sdatei
End Sub
Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
-
- ***
- Beiträge: 53
- Registriert: Mo, 27.11.2006 15:17
- Wohnort: Nürnberg
- Kontaktdaten:
Re: UTC Offset ermitteln - wie geht das?
@Karolus
Hallo Karo,
danke für Deine Antwort. Dein Script ist für LINUX und funktioniert sicher auch. Ich bin aber nach einer Suche nach einer plattformunabhägigen Lösung. Von daher nützt es mir leider nichts
.
Ich habe gestern diesbezüglich mal eine E-Mail an Andrew Pitonyak geschickt. Er hat mich an folgende Adresse verwiesen:
http://wiki.services.openoffice.org/wik ... #XCalendar
In der aktuellen Ooo API steht in der Modulbeschreibung (:: com :: sun :: star :: i18n :: )jedoch folgendes:
Interface for internationalization (deprecated draft).
Handelt es sich beim Modul um ein "Auslaufmodell"
... Ich werde mich trotzdem damit mal auseinandersetzen.
Greetz,
Billy
Hallo Karo,
danke für Deine Antwort. Dein Script ist für LINUX und funktioniert sicher auch. Ich bin aber nach einer Suche nach einer plattformunabhägigen Lösung. Von daher nützt es mir leider nichts

Ich habe gestern diesbezüglich mal eine E-Mail an Andrew Pitonyak geschickt. Er hat mich an folgende Adresse verwiesen:
http://wiki.services.openoffice.org/wik ... #XCalendar
In der aktuellen Ooo API steht in der Modulbeschreibung (:: com :: sun :: star :: i18n :: )jedoch folgendes:
Interface for internationalization (deprecated draft).
Handelt es sich beim Modul um ein "Auslaufmodell"

... Ich werde mich trotzdem damit mal auseinandersetzen.
Greetz,
Billy
... im Prinzip ist alles einfach. Vorausgesetzt man weiss, wie's geht!
Re: UTC Offset ermitteln - wie geht das?
Hallo
Wie der Forumstitel vermuten lässt, kann OOo ja auch Java.
Ich leider nicht
Dennoch hab ich zum Thema diese Seite gefunden, und damit das "hello World" -Javabeispiel für Writer umgebaut:
Bei Ausführung des Codes wird '-60' im Dokument eingefügt, was dann wohl der Offset in Minuten ist, wieso hier ein minus davor ist weiss ich ich auch nicht.
Gruß Karo
Wie der Forumstitel vermuten lässt, kann OOo ja auch Java.

Ich leider nicht

Dennoch hab ich zum Thema diese Seite gefunden, und damit das "hello World" -Javabeispiel für Writer umgebaut:
Code: Alles auswählen
// Timeoffset in JavaScript
importClass(Packages.com.sun.star.uno.UnoRuntime);
importClass(Packages.com.sun.star.text.XTextDocument);
importClass(Packages.com.sun.star.text.XText);
importClass(Packages.com.sun.star.text.XTextRange);
var d = new Date();
offset = d.getTimezoneOffset();
//get the document from the scripting context
oDoc = XSCRIPTCONTEXT.getDocument();
//get the XTextDocument interface
xTextDoc = UnoRuntime.queryInterface(XTextDocument,oDoc);
//get the XText interface
xText = xTextDoc.getText();
//get an (empty) XTextRange interface at the end of the text
xTextRange = xText.getEnd();
//set the text in the XTextRange
xTextRange.setString( offset );
Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
-
- ***
- Beiträge: 53
- Registriert: Mo, 27.11.2006 15:17
- Wohnort: Nürnberg
- Kontaktdaten:
Re: UTC Offset ermitteln - wie geht das?
Karolus hat geschrieben:...Wie der Forumstitel vermuten lässt, kann OOo ja auch Java.![]()
Ich leider nicht...


Aber Dein Ansatz ist klasse. Tatsächlich gibt es in JavaScript die Funktion getTimezoneOffset(). Die macht auch das, was ich benötige und wäre dazu noch plattformunabhängig. Übrigens: Der Rückgabewert entspricht Minuten (siehe hier: http://de.selfhtml.org/javascript/objek ... one_offset.
Ich könnte zwar in JavaScript programmieren, habe jedoch das Problem, dass ich unter Ooo bis jetzt noch nicht mit JavaScript gearbeitet habe.
Ich habe unter Ooo bis jetzt nur in Basic programmiert.
Jetzt tut sich für mich das Problem auf, dass ich absolut keine Ahnung habe, wie ich den JavaScript Code erstelle, wie ich darauf zugreife und wo ich den Code ablegen muss. Das einzige, was ich gerade auf die schnelle herausgefunden habe ist, dass sich über Extras -> Makros -> Makros verwalten -> JavaScript ... der Rhino JavaScript Debugger öffnet. Darin gibt's das "Hello World" Beispiel. Ich kann damit leider noch nichts damit anfangen

Ich werde wohl dazu noch etwas "googeln" müssen ....

Mein Ziel ist, aus einem Ooo Basic-Makro die Übergabe einer Variable im Date-Format ("DD.MM.YYYY HH:MM:SS") an eine Funktion/Routine im JavaScript Modul und als Rückgabe den berechneten Zeitzonen-Offset zu bekommen - also auf Deinen Ansatz weiter aufbauen.
Aber erst mal vielen Dank für Deinen Ansatz, das war auf alle Fälle ein guter Einstieg. (... an die Verwendung von JavaScript in Ooo hatte ich gar nicht mehr gedacht

Greetz,
Billy

... im Prinzip ist alles einfach. Vorausgesetzt man weiss, wie's geht!
Re: UTC Offset ermitteln - wie geht das?
Hi!
Folgenden Code benutze ich, um eine GPS Zeit (UTC) in "unsere" Zeit umzuwandeln.
Mit ein paar Änderungen sollte der Code auch bei Dir passen (Open Office Basic)
Grüße, Ralf
Folgenden Code benutze ich, um eine GPS Zeit (UTC) in "unsere" Zeit umzuwandeln.
Mit ein paar Änderungen sollte der Code auch bei Dir passen (Open Office Basic)
Code: Alles auswählen
' #### wandelt die übergebene Zeit (GPS Zeit in die lokale Zeit, #########
' #### unter Berücksichtigung der Winter/Sommerzeit um
function holeCEST(zeit as date) as date
const ZEITZONE = +1 ' +1 = BERLIN
dim szeit as date ' Beginn der Sommerzeit
dim wzeit as date ' Beginn der Winterzeit
rem addiere Zeitzone (auch negative möglich, deshalb so kompliziert!)
if zeitzone > 0 then
zeit = zeit + TimeSerial(zeitzone, 0, 0)
else
zeit = zeit - TimeSerial(zeitzone-2*zeitzone, 0, 0)
endif
rem errechne die Sommerzeit / Winterzeitumstellung für das entsprechende Jahr
szeit = DateSerial(year(zeit), 3,31) -(weekday(DateSerial(year(zeit), 3,31))-1) + TimeSerial(1, 59, 59)
wzeit = DateSerial(year(zeit),10,31) -(weekday(DateSerial(year(zeit),10,31))-1) + TimeSerial(1, 59, 59)
if (zeit > szeit) and (zeit < wzeit) then rem wenn Sommerzeit nochmals +1 h
zeit = zeit + TimeSerial(1, 0, 0)
end if
holeCEST=zeit
end function
-
- ***
- Beiträge: 53
- Registriert: Mo, 27.11.2006 15:17
- Wohnort: Nürnberg
- Kontaktdaten:
Re: UTC Offset ermitteln - wie geht das?
@Raka
Hallo Ralf,
Du verwendest die Zeitzone als Konstante, die Du hart vercodet hast. Das geht natürlich und man kann damit auch rechnen.
Aber was machst Du, wenn Du Dein Programm in anderen Zeitzonen einsetzen möchtest - jedes mal den Code anpassen
... das ist auf jeden Fall keine gute (professionelle) Lösung.
Da wo Karo ansetzt, muss man weitermachen. Der Offset muss aus der im System eingestellten Zeitzone abgeleitet werden.
Greetz,
Billy
Hallo Ralf,
Du verwendest die Zeitzone als Konstante, die Du hart vercodet hast. Das geht natürlich und man kann damit auch rechnen.
Aber was machst Du, wenn Du Dein Programm in anderen Zeitzonen einsetzen möchtest - jedes mal den Code anpassen

... das ist auf jeden Fall keine gute (professionelle) Lösung.
Da wo Karo ansetzt, muss man weitermachen. Der Offset muss aus der im System eingestellten Zeitzone abgeleitet werden.
Greetz,
Billy
... im Prinzip ist alles einfach. Vorausgesetzt man weiss, wie's geht!
Re: UTC Offset ermitteln - wie geht das?
Da hast Du natürlich recht - unsauberer Code. Die Frage ist aber doch, ob ich nur den Sommer/Winter-Offset der aktuellen Systemzeit haben möchte oder
--wie in meinem Fall-- eine vorgegebene UTC Zeit (GPS Zeit) in CEST umrechnen möchte. Da helfen mir Systemroutinen wenig weiter, da ich ja feststellen muß, ob Winter oder Sommer war. Und da funktioniert mein Code gut.
Wie man die Geo-Zeitzone mit StarBasic ausliest kann ich dir nicht sagen.
Schönen Abend noch,
der Ralf
--wie in meinem Fall-- eine vorgegebene UTC Zeit (GPS Zeit) in CEST umrechnen möchte. Da helfen mir Systemroutinen wenig weiter, da ich ja feststellen muß, ob Winter oder Sommer war. Und da funktioniert mein Code gut.
Wie man die Geo-Zeitzone mit StarBasic ausliest kann ich dir nicht sagen.
Schönen Abend noch,
der Ralf
-
- **
- Beiträge: 32
- Registriert: So, 25.02.2007 09:11
- Wohnort: Ingolstadt
Re: UTC Offset ermitteln - wie geht das?
Hallo,
wenn ich richtig mitgelesen habe, dann kann JavaScript die Funktion.
In diesem Thread http://www.oooforum.org/forum/viewtopic ... 4338#84338 wird erklärt wie man JavaScript Functionen aus Basic aufruft.
Ich hoffe das hilft.
Gruß
Hawk
wenn ich richtig mitgelesen habe, dann kann JavaScript die Funktion.
In diesem Thread http://www.oooforum.org/forum/viewtopic ... 4338#84338 wird erklärt wie man JavaScript Functionen aus Basic aufruft.
Ich hoffe das hilft.

Gruß
Hawk
OOO Basic Programmierers best Friend XRay-Tool
-
- ***
- Beiträge: 53
- Registriert: Mo, 27.11.2006 15:17
- Wohnort: Nürnberg
- Kontaktdaten:
Re: UTC Offset ermitteln - wie geht das? (Gelöst!)
Hallo zusammen,
erst mal vielen Dank für die vielen Antworten.
Ich habe mich gestern abend noch ein paar Stündchen im Web vergnügt und mir eine Lösung zusammengebastelt (... ich drücke mich ganz bewußt so aus, weil ich mir absolut keinen Reim darauf machen kann, warum das funktioniert; aber dazu später mehr.)
@RaKA
... guckst Du hier:
Zunächst einmal: Über StarBasic und der Ooo API habe ich leider keine passende Funktion gefunden. Karolus hat aber die blendende Idee
gehabt JavaScript zu verwenden. Da gibt es so eine Funktion! Da JavaScript in Ooo lauffähig ist, wäre dies demnach auch plattformunabhängig
.
Hier der Code:
Dazu habe ich zunächst im Dokument die Bibliothek "Test" (Extras -> Makros -> Makros verwalten -> JavaScript...) angelegt und darin das Modul "TimeZoneOffset.js" erstellt. Nun öffnet sich der Rhino JavaScript Debugger. Darin habe ich den Code eingefügt und über "File -> Save" gespeichert.
Der JavaScript Teil ist damit erledigt. Nun zum Aufruf des JavaScripts aus dem Ooo-Basic Modul. Dazu habe ich folgenden Code erstellt:
Das Testdatum habe ich mir aus einzelnen Variablen zusammengebaut, da dies zu Testzwecken im Handling einfacher ist.
Wenn man ein Datum innerhalb der MEZ übergibt, erhält man in der MessageBox -1. Bei einem Datum innerhalb der MESZ erhält man -2. Das Vorzeichen ist insofern praktisch, weil man so mit DateAdd() die UTC direkt ausrechnen lassen kann
.
Ziemlich suspekt ist mir jedoch die Sache mit dem Aufruf des JavaScripts!
Wieso kann man bei invoke() den Funktionsnamen der aufzurufenden Funktion einfach weglassen? In der API ist dieser nicht als optional deklariert (siehe: http://api.openoffice.org/docs/common/r ... tml#invoke.
Die Übergabe der anderen Parameter ist mir einigermaßen verständlich (... mit aOutParamIndex und aOutParam kann ich momentan auch leider nichts anfangen!), aber weshalb wird der Rückgabewert aus dem JavaScript korrekt übergeben, obwohl ich ihn nirgends "bewußt" zugewiesen habe
Wenn mir da jemand weiterhelfen kann, wäre ich sehr dankbar.
P.S.
@hawkhunter2002
Greetz,
Billy
erst mal vielen Dank für die vielen Antworten.
Ich habe mich gestern abend noch ein paar Stündchen im Web vergnügt und mir eine Lösung zusammengebastelt (... ich drücke mich ganz bewußt so aus, weil ich mir absolut keinen Reim darauf machen kann, warum das funktioniert; aber dazu später mehr.)
@RaKA
Genau dieses Problem habe ich auch!...Die Frage ist aber doch, ob ich nur den Sommer/Winter-Offset der aktuellen Systemzeit haben möchte oder
--wie in meinem Fall-- eine vorgegebene UTC Zeit (GPS Zeit) in CEST umrechnen möchte. ...

...Wie man die Geo-Zeitzone mit StarBasic ausliest kann ich dir nicht sagen. ...

Zunächst einmal: Über StarBasic und der Ooo API habe ich leider keine passende Funktion gefunden. Karolus hat aber die blendende Idee


Hier der Code:
Code: Alles auswählen
var year = ARGUMENTS[0];
var month = ARGUMENTS[1];
var day = ARGUMENTS[2];
var hours = ARGUMENTS[3];
var minutes = ARGUMENTS[4];
var seconds = ARGUMENTS[5];
var d = new Date( year, month, day, hours, minutes, seconds );
d.getTimezoneOffset() / 60;
Der JavaScript Teil ist damit erledigt. Nun zum Aufruf des JavaScripts aus dem Ooo-Basic Modul. Dazu habe ich folgenden Code erstellt:
Code: Alles auswählen
Option Explicit
Sub callJavaScript()
Dim oDocScriptProvider As Object
Dim oScriptTimeZoneOffset As Object
Dim iTimezoneOffset%
Dim iYYYY%, iM%, iD%, iHH%, iMM%, iSS%
REM Testdaten
iYYYY = 2009
iM = 09
iD = 25
iHH = 03
iMM = 00
iSS = 00
'Use this, if you install the JavaScript locally in the current doc
oDocScriptProvider = ThisComponent.getScriptProvider()
oScriptTimeZoneOffset = oDocScriptProvider.getScript( _
"vnd.sun.star.script:Test.TimeZoneOffset.js?language=JavaScript&location=document")
iTimezoneOffset = oScriptTimeZoneOffset.invoke( Array( iYYYY, iM, iD, iHH, iMM, iSS ), Array(), Array() )
MsgBox( "Der TimeZoneOffset beträgt: " & iTimezoneOffset )
End Sub
Wenn man ein Datum innerhalb der MEZ übergibt, erhält man in der MessageBox -1. Bei einem Datum innerhalb der MESZ erhält man -2. Das Vorzeichen ist insofern praktisch, weil man so mit DateAdd() die UTC direkt ausrechnen lassen kann

Ziemlich suspekt ist mir jedoch die Sache mit dem Aufruf des JavaScripts!
Wieso kann man bei invoke() den Funktionsnamen der aufzurufenden Funktion einfach weglassen? In der API ist dieser nicht als optional deklariert (siehe: http://api.openoffice.org/docs/common/r ... tml#invoke.
Die Übergabe der anderen Parameter ist mir einigermaßen verständlich (... mit aOutParamIndex und aOutParam kann ich momentan auch leider nichts anfangen!), aber weshalb wird der Rückgabewert aus dem JavaScript korrekt übergeben, obwohl ich ihn nirgends "bewußt" zugewiesen habe



Wenn mir da jemand weiterhelfen kann, wäre ich sehr dankbar.
P.S.
@hawkhunter2002
... auf diese Seite bin ich gestern abned auch noch gestoßen. Aber wirklich verstanden habe ich das nicht. Irgendwie vermisse ich ein vernünftiges Tutorial zum einbinden von Scripten in Ooo.... In diesem Thread http://www.oooforum.org/forum/viewtopic ... 4338#84338 wird erklärt wie man JavaScript Functionen aus Basic aufruft....
Greetz,
Billy
... im Prinzip ist alles einfach. Vorausgesetzt man weiss, wie's geht!
Re: UTC Offset ermitteln - wie geht das?
Hallo Billy
Glückwunsch - klappt auch hier.
Ich hatte seit gestern abend auch etwas rumprobiert aber leider ohne Erfolg.
'oScriptTimeZoneOffset = oDocScriptProvider.getScript....' explizit .....
Gruß Karo
Glückwunsch - klappt auch hier.

Ich hatte seit gestern abend auch etwas rumprobiert aber leider ohne Erfolg.
Das der Aufruf ohne Scriptname funktioniert ist für mich noch verständlich - du referenzierst vorher ja mit:Billy hat geschrieben:Ziemlich suspekt ist mir jedoch die Sache mit dem Aufruf des JavaScripts!
Wieso kann man bei invoke() den Funktionsnamen der aufzurufenden Funktion einfach weglassen?
'oScriptTimeZoneOffset = oDocScriptProvider.getScript....' explizit .....
....aber das die Rückgabe des Scripts so "einfach" funktioniert wundert mich auch.Billy hat geschrieben: Die Übergabe der anderen Parameter ist mir einigermaßen verständlich (... mit aOutParamIndex und aOutParam kann ich momentan auch leider nichts anfangen!), aber weshalb wird der Rückgabewert aus dem JavaScript korrekt übergeben, obwohl ich ihn nirgends "bewußt" zugewiesen habe
Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)