UTC Offset ermitteln - wie geht das?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

keyboard-billy
***
Beiträge: 53
Registriert: Mo, 27.11.2006 15:17
Wohnort: Nürnberg
Kontaktdaten:

UTC Offset ermitteln - wie geht das?

Beitrag von keyboard-billy »

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
... im Prinzip ist alles einfach. Vorausgesetzt man weiss, wie's geht!
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: UTC Offset ermitteln - wie geht das?

Beitrag von Karolus »

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.

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
Vielleicht gibts unter Windows ja etwas ähnliches

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
keyboard-billy
***
Beiträge: 53
Registriert: Mo, 27.11.2006 15:17
Wohnort: Nürnberg
Kontaktdaten:

Re: UTC Offset ermitteln - wie geht das?

Beitrag von keyboard-billy »

@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
... im Prinzip ist alles einfach. Vorausgesetzt man weiss, wie's geht!
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: UTC Offset ermitteln - wie geht das?

Beitrag von Karolus »

Hallo
Wie der Forumstitel vermuten lässt, kann OOo ja auch Java. :D
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 );
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
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
keyboard-billy
***
Beiträge: 53
Registriert: Mo, 27.11.2006 15:17
Wohnort: Nürnberg
Kontaktdaten:

Re: UTC Offset ermitteln - wie geht das?

Beitrag von keyboard-billy »

Karolus hat geschrieben:...Wie der Forumstitel vermuten lässt, kann OOo ja auch Java. :D
Ich leider nicht :? ...
:arrow: Bitte nicht Java mit JavaScript verwechseln. Dein Code ist in JavaScript geschrieben :wink: .

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 :P .

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

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 :oops: )

Greetz,
Billy :!:
... im Prinzip ist alles einfach. Vorausgesetzt man weiss, wie's geht!
RaKa
*
Beiträge: 12
Registriert: Di, 05.08.2008 18:50

Re: UTC Offset ermitteln - wie geht das?

Beitrag von RaKa »

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)

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

Grüße, Ralf
keyboard-billy
***
Beiträge: 53
Registriert: Mo, 27.11.2006 15:17
Wohnort: Nürnberg
Kontaktdaten:

Re: UTC Offset ermitteln - wie geht das?

Beitrag von keyboard-billy »

@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
... im Prinzip ist alles einfach. Vorausgesetzt man weiss, wie's geht!
RaKa
*
Beiträge: 12
Registriert: Di, 05.08.2008 18:50

Re: UTC Offset ermitteln - wie geht das?

Beitrag von RaKa »

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
hawkhunter2002
**
Beiträge: 32
Registriert: So, 25.02.2007 09:11
Wohnort: Ingolstadt

Re: UTC Offset ermitteln - wie geht das?

Beitrag von hawkhunter2002 »

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. :D

Gruß

Hawk
OOO Basic Programmierers best Friend XRay-Tool
keyboard-billy
***
Beiträge: 53
Registriert: Mo, 27.11.2006 15:17
Wohnort: Nürnberg
Kontaktdaten:

Re: UTC Offset ermitteln - wie geht das? (Gelöst!)

Beitrag von keyboard-billy »

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
...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. ...
Genau dieses Problem habe ich auch! :)
...Wie man die Geo-Zeitzone mit StarBasic ausliest kann ich dir nicht sagen. ...
:idea: ... 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 8) gehabt JavaScript zu verwenden. Da gibt es so eine Funktion! Da JavaScript in Ooo lauffähig ist, wäre dies demnach auch plattformunabhängig :mrgreen: .
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;
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:

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
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 :D .

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
... In diesem Thread http://www.oooforum.org/forum/viewtopic ... 4338#84338 wird erklärt wie man JavaScript Functionen aus Basic aufruft....
... 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.

Greetz,
Billy
... im Prinzip ist alles einfach. Vorausgesetzt man weiss, wie's geht!
Karolus
********
Beiträge: 7440
Registriert: Mo, 02.01.2006 19:48

Re: UTC Offset ermitteln - wie geht das?

Beitrag von Karolus »

Hallo Billy
Glückwunsch - klappt auch hier. :D
Ich hatte seit gestern abend auch etwas rumprobiert aber leider ohne Erfolg.
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?
Das der Aufruf ohne Scriptname funktioniert ist für mich noch verständlich - du referenzierst vorher ja mit:
'oScriptTimeZoneOffset = oDocScriptProvider.getScript....' explizit .....
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
....aber das die Rückgabe des Scripts so "einfach" funktioniert wundert mich auch.

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
Antworten