Archiv des Intrexx Live! Forums

Hier sehen Sie die Foreneinträge aus dem Intrexx Live! Forum. Bis November 2016 war es das Forum für alle Fragen rund um die Software Intrexx von United Planet.
Seit November 2016 gibt es ein neues moderiertes Forum, das Intrexx Community Forum. Nutzen Sie bitte unbedingt dieses für aktuelle Fragen, Antworten und Informationen.

Wichtig: Dieses Forum dient als Archiv. Die Einträge beziehen sich oft auf ältere Versionen von Intrexx und entsprechen nicht mehr den aktuellen technischen Gegebenheiten.
Daher sollten alle Inhalte ausschließlich von Experten genutzt werden. Bei unsachgemäßer Anwendung kann es zu zeitaufwändigen Problemen oder Datenverlust kommen.
Übersicht > Intrexx Professional: Programming > [Gelöst] Datum und Uhrzeit (Intrexx6 Groovy)

[Gelöst] Datum und Uhrzeit (Intrexx6 Groovy)

Hallo zusammen,

ich übergebe einen Datum/Uhrzeitwert per Request an einen Prozess (Groovy) in der Form DD.MM.YYYY HH:MM (20.05.2016 13:09)

Diesen Requestwert möchte in ein MSSQL als UTC -->>2016-05-20 11:09:00.000 speichern

TimeZone tz = TimeZone.getTimeZone("UTC")
def mytz = g_session.user.timeZone
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm") //wenn ich das UTC Format nehme gibt es einen Fehler beim parsen
String StartString = g_request.rq_start // Requestvariable
sdf.setTimeZone(tz)Date myStart = sdf.parse(StartString)
g_dbQuery.executeUpdate(myCon,sql){
setTimestamp(6, myStart,mytz)} // speichert 2016-05-20 15:09:00.000
g_dbQuery.executeUpdate(myCon,sql){
setTimestamp(6, myStart,tz)} // speichert 2016-05-20 13:09:00.000






Wie geht das aber richtigt?
20.05.2016 16:04 von cbarth
Im Prinzip musst du im Groovy die Zeitzone mitgeben die der übergebene Zeitstempel hat.
Intrexx wandelt dann beim Speichern in UTC um.

Da man jedoch an der Stelle evtl. nicht feststellen kann was der Benutzer für eine Zeitzone gewählt hat sollte man im JavaScript schon in UTC umwandeln.
Siehe auch hier: https://www.unitedplanet.com/forum/index.php?page=Thread&threadID=25137
21.05.2016 06:40 von MartinW
Im Prinzip musst du im Groovy die Zeitzone mitgeben die der übergebene Zeitstempel hat.
Intrexx wandelt dann beim Speichern in UTC um.

Da man jedoch an der Stelle evtl. nicht feststellen kann was der Benutzer für eine Zeitzone gewählt hat sollte man im JavaScript schon in UTC umwandeln.
Siehe auch hier: https://www.unitedplanet.com/forum/index.php?page=Thread&threadID=25137
genau das mache ich ja im JS
var o_start = getDateObject(getElement("GUID")); /*Bearbeitung gestartet datetimecontrol*/ $.when(triggerUserWorkflowEvent("GUID",{rq_start: o_start.toUTCString()}))


deshalb kommt diese Form des Zeitstempels im Groovy an attention

Auszug workflow.log


INFO 2016-05-21 10:38:54,054 - de.uplanet.lucy.server.workflow.WorkflowSystem[WebConnectorWorker-localhost:8102-0]
g_request.rq_start Fri, 20 May 2016 20:28:00 GMT
INFO 2016-05-21 10:38:54,054 - de.uplanet.lucy.server.workflow.WorkflowSystem[WebConnectorWorker-localhost:8102-0]
StartString Fri, 20 May 2016 20:28:00 GMT
ERROR 2016-05-21 10:38:54,054 - de.uplanet.lucy.server.workflow.WorkflowEngine[WebConnectorWorker-localhost:8102-0]
wfGuid=12B880A6F7E198A31D57C87D07B09FBC01041660 wfTitle="CB_AUFGABEN" wfRun=12B880A6F7E198A31D57C87D07B09FBC01041660-1462520864086 wfObjGuid=6825BD256CE2F82376DB699067FD159A61D16E6B wfObjClass=de.uplanet.lucy.server.workflow.action.GroovyScriptWorkflowAction wfObjTitle="DS insert" Error while processing workflow.
org.codehaus.groovy.runtime.InvokerInvocationException: java.text.ParseException: Unparseable date: "Fri, 20 May 2016 20:28:00 GMT"

Also ich könnte jetzt hin gehen und versuchen den Request String in die Datenbank zu schreiben ohne diesen in ein Datum zu wandeln. Aber dies ist
ja nicht der Zweck.

Wie erledigen denn UP solche Sachen? Sollte doch einfach sein.
1. Wert per JS aus einer Eingabe auslesen
2. ausgelesenen Wert an Groovy übergeben
3. übergebenen Wert in Groovy verarbeiten
4. verarbeiteten Wert in der Datenbank speichern
...
21.05.2016 08:50 von cbarth
Hallo,

die
toUTCString-Methode (Javascript Date) liefert eine "human readable" Repräsentation des Datumsobjektes, also für Menschen gut "lesbaren" String.
Allgemein lässt er sich aber schlechter parsen.
Daher eignet sich die
toISOString-Methode besser. Sie liefert den String
'2016-05-20T20:28:00.012Z' (UTC).

Damit bieten sich auf Groovy-Seite folgende Möglichkeiten (Zeitzone des Users ist irrelevant, da immer in UTC gearbeitet wird):

// Parsen und via Prepared-Statement-Parameter einsetzen
import de.uplanet.util.DateParser

def strMyStart = g_request.get('rq_MyStart') // i.e. '2016-05-20T20:28:00.000Z'
def myStart = DateParser.parseDate(str.replaceAll(/\.\d{3}Z/,"Z")) // Millisekunden müssen abgeschnitten werden
g_dbQuery.executeUpdate(myCon,sql){
...
setTimestamp(6, myStart)}


// Direkt in den Query-String einbauen
def strMyStart = g_request.get('rq_MyStart') // i.e. '2016-05-20T20:28:00.000Z'

def sql = "INSERT INTO DATAGROUP('1A98...56B4') (...,dtstart) VALUES (..., '${strMyStart}')"
g_dbQuery.executeUpdate(myCon, sql){
...}



Alternativ kann man den Datumswert im Request auch als Millisekunden-String übergeben. Dieser basiert ja bekanntermaßen immer auf dem 01.01.1970, 00:00:00 GMT.

...
var myStart = getDateObject(getElement('83C1...0A78'));
oCtrl.oTarget.addParam = Helper.setQsValueByParam("rq_MyStart", myStart.getTime().toString(), oCtrl.oTarget.addParam);
...

Auf Groovy-Seite dann
def strMyStart = g_request.get('rq_MyStart') // i.e. '1463776080000'

// via java.util.Date
def myStart = new Date(Long.parseLong(strMyStart)) // java.util.Date

// via java.sql.Timestamp
import java.sql.Timestamp

def myStart = new Timestamp(Long.parseLong(strMyStart)) // java.sql.Timestamp

// Dann über das Prepared Statement setzen
g_dbQuery.executeUpdate(myCon,sql){
...
setTimestamp(6, myStart)}


Gruß,
handw3rker
22.05.2016 04:17 von handw3rker
Hallo handw3rker,

danke, danke, danke

genau das habe ich gebraucht. Ich übergebe nun die meine Startzeit als Millisekunden-String im JS

$.when(triggerUserWorkflowEvent("GUID",{rq_start: o_start.getTime().toString()}))




und setze auf der Groovy Seite nur noch den Timestamp fürs speichen in der Datenbank
def myStart = new Timestamp(Long.parseLong(g_request.rq_start)) // java.sql.Timestamp


Danke nochmal. Jetzt klappt es super!!!
22.05.2016 20:03 von cbarth
Zurück | Alles über Intrexx | Impressum | Datenschutzerklärung

Über United Planet
© 2019 United Planet GmbH
Schnewlinstraße 2
79098 Freiburg