TimeStamp

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

TimeStamp

Beitrag von Manfred »

So,

habe jetzt lange gesucht, aber nix im Forum gefunden.

Wie bekome ich einen echten Timestamp hin? Hat jemand eine Idee?

Nur einfach Date() und dann Time() und dann zusammenschreiben... das ist es nicht. Auf der Devcon hatte ich darüber auf ein Gespräch. Bei Mitternacht klappt das dann nicht. Und das kann durchaus vorkommen bei mir.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Manfred,

da musst Du dann wohl etwas warten. Bis die von Steffen angekündigten Erweiterungen kommen. 8) Die Du ja selber auch gerade erwähnt hast.

Jan
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Jan,

es tut mir Leid, aber ich habe nicht so viel Ruhe im Körper wie Du und kann darauf warten... :lol:

Es würde mich jetzt aber auch mal so interesserien, ob man es machen kann. Vielleicht gibt es ja noch einen Trick, den hier jemand preiswert anbieten möchte.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: TimeStamp

Beitrag von AUGE_OHR »

hi
Manfred hat geschrieben: Wie bekome ich einen echten Timestamp hin? Hat jemand eine Idee?

Nur einfach Date() und dann Time() und dann zusammenschreiben... das ist es nicht.
nimm doch

Code: Alles auswählen

cTimeStamp := DTOS(DATE())+STRZERO(SECONDS(),8,2)
das sollte eine Auflösund von 1/100sec. ermöglichen.

gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hm,

aber damit bekomme ich keine lesbare Uhrzeit übergeben. Es sollte was für das Auge sein. ( Ich meine jetzt nicht Deinen Kumpel... :lol: )
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Manfred,

einen 'richtigen' Timestamp kann es so nicht geben, das hat ja Steffen schon geschrieben.

Wenn es bei dir nicht auf die Sekunde ankommt, kannst du mit der Ausnahme um Mitternacht herum den folgenden Befehl nutzen:

Date()+" "+Time()

"12.12.2007 23:59:55" wird zwar millisekunden hinter dem eigentlichen liegen, das dürfte dich aber nicht jucken ;-)

"12.12.2007 23:59:59" stimmt auch noch, aber es könnte etwas später so sein:
"12.12.2007 00:00:00" statt
"13.12.2007 00:00:00"

folgendes müsste doch gehen, bis die richtigen kommen - was meint ihr ?

Code: Alles auswählen

function TimeStamp()
   local cTime1, cTime2
   cTime1  :=   Date()+" "+Time()
   cTime2  :=   Date()+" "+Time()

   if left(cTime1,6) # left(cTime2,6)
      return cTime2
   endif
return cTime1


So stimmt zumindest die Tag+Zeit +- 1 Sekunde.
Falls dir das nicht reicht wird es übel ;-)

oder aber man nimmt diesen code:

Code: Alles auswählen

function TimeStamp()
   local cTime1, cTime2, nLen
   cTime1  :=   Date()+" "+Time()
   cTime2  :=   Date()+" "+Time()

   if left(cTime1,6) # left(cTime2,6)
      nLen := len(date())
      cTime1 := left(cTime1,nLen)+" 23:59:59"
   endif

return cTime1


das müsste eigentlich immer stimmen, denn die Zeit zwischen Date() und Time() ist auf jeden Fall deutlich kleiner als eine Sekunde, somit ist dies der Wert der zur Zeit der Date() abfrage gültig war, wenn danach Date() einen Tag höher ist.

Oder sollte ich mich da irren ?

Probemessungen dürften schwierig werden ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: Probemessungen dürften schwierig werden ;-)
wieso ? Systemzeit kann man doch verändern und dann

Code: Alles auswählen

#include "COMMON.CH"

PROCEDURE Main
LOCAL nKey := 0
LOCAL cTimeStamp

SET ALTER TO TSTAMP.TXT
SET ALTER ON

DO WHILE !nKey = 27
   nKey := INKEY(0.1)
   ? cTimeStamp := DTOS( DATE() )+" "+SEC2HMS( SECONDS() ,.T.)
   SLEEP(10)
ENDDO

SET ALTER OFF
SET ALTER TO
RETURN

FUNCTION SEC2HMS(nSec,lDec)
LOCAL cString := ""
LOCAL nInt    := 0
LOCAL nHH     := 0
LOCAL nMM     := 0
LOCAL nSS     := 0
LOCAL nDec    := 0

   // 908.992 - 966.600
   DEFAULT lDec TO .T.

   // store decimal to nDec for later use
   nDec := nSec - INT(nSec)

   IF nSec >= 3600
      nHH  := INT(nSec / 60 / 60)
      nInt := (nSec - (nHH * 60 * 60)) / 60
   ELSE
      nInt := nSec / 60
   ENDIF

   nMM := INT(nInt)
   nSS := INT(ROUND((nInt - nMM) * 60,0))

   IF lDec
      cString := IF(nHH > 0,STRZERO(nHH,2)+":","00:")+;
                 IF(nMM > 0,STRZERO(nMM,2)+":","00:")+;
                            STRZERO(nSS,2)+":"+STRZERO(nDec*1000,3)
   ELSE
      cString := IF(nHH > 0,STRZERO(nHH,2)+":","00:")+;
                 IF(nMM > 0,STRZERO(nMM,2)+":","00:")+;
                            STRZERO(nSS,2)
   ENDIF

RETURN cString
aber meine Funktion macht wohl bei den "1/100" Stellen Probleme

Code: Alles auswählen

20071117 23:59:57:480
20071117 23:59:58:700
20071117 23:59:58:920
20071117 23:59:58:140
20071117 23:59:58:350
20071117 23:59:59:570
20071117 23:59:59:790
20071117 23:59:59:010
20071117 23:59:59:230
20071117 23:59:59:450
20071117 23:59:60:670
20071117 23:59:60:890
20071118 00:00:00:100
20071118 00:00:00:320
20071118 00:00:01:540
20071118 00:00:01:760
20071118 00:00:01:980
20071118 00:00:01:200
20071118 00:00:01:420
20071118 00:00:02:640
20071118 00:00:02:850
20071118 00:00:02:070
20071118 00:00:02:290
20071118 00:00:03:510
20071118 00:00:03:730
20071118 00:00:03:950
20071118 00:00:03:170
20071118 00:00:03:390
20071118 00:00:04:600
wer "sieht" meinen Fehler ?

gruss by OHR
Jimmy
dirk
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 29
Registriert: Mi, 05. Jul 2006 15:17
Wohnort: 26689 Augustfehn

Beitrag von dirk »

Vielleicht hilft meine Funktion "Systemzeit" weiter, bei der ich die Windows API Funktion GetSystemTime verwende:

Code: Alles auswählen

#include "dll.ch"
FUNCTION Systemzeit ( )
   LOCAL lpZeit:=space(16)
   LOCAL i:=0
   LOCAL nYear, nMonth, DayOfWeek, nDay
   LOCAL nHour, nMinute, nSecond, nMillisecond

   GetSystemTime( @lpZeit)
   nYear        := UInt16ToInt (lpZeit[1], lpZeit[2])
   nMonth       := UInt16ToInt (lpZeit[3], lpZeit[4])
   DayOfWeek    := UInt16ToInt (lpZeit[5], lpZeit[6])
   nDay         := UInt16ToInt (lpZeit[7], lpZeit[8])
   nHour        := UInt16ToInt (lpZeit[9], lpZeit[10])
   nMinute      := UInt16ToInt (lpZeit[11], lpZeit[12])
   nSecond      := UInt16ToInt (lpZeit[13], lpZeit[14])
   nMillisecond := UInt16ToInt (lpZeit[15], lpZeit[16])
RETURN strzero(nYear,4)+strzero(nMonth,2)+strzero(nDay,2)+" "+strzero(nHour,2)+":"+strzero(nMinute,2)+":"+strzero(nSecond,2)+"::"+strzero(nMillisecond,3)

FUNCTION UInt16ToInt (LoByte, HiByte)
   RETURN ASC(LoByte)+256*ASC(HiByte)

DLLFUNCTION GetSystemTime( @lpZeit ) ;
         USING STDCALL ;
         FROM KERNEL32.DLL
Ich weiß allerdings nicht genau, wie die Betriebssystemfunktion Datum und Uhrzeit ermittelt, aber ich meine gelesen zu haben, daß die Realtimeclock direkt ausgelesen wird (dadurch wird die UTC Zeit zurückgegeben, also in unseren Gefilden eine Stunde zurück!)
Viele Grüße
dirk
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
dirk hat geschrieben: Vielleicht hilft meine Funktion "Systemzeit" weiter, bei der ich die Windows API Funktion GetSystemTime verwende:
Danke für deine Funktion.

Ich bekomme die Zeit auch als Time - Code wobei ich nun beim
obrigen Test festgestellt habe das in meiner Function

Code: Alles auswählen

SEC2HMS(nSec,lDec) 
der Dezimal Teil falsch berechnet/dargestellt werden ... nur wo liegt im
Code der "Denk"-Fehler ?

gruss by OHR
Jimmy
Krause
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Mo, 08. Jan 2007 8:55
Wohnort: In Thüringen

Beitrag von Krause »

Wahrscheinlich bekommt man nur einen korrekten Zeitstempel, wenn sich alle Workstationen diesen von ein und dem selben Zeitserver im Netzwerk holen. Programmiert habe ich so etwas allerdings noch nicht, derartige Genauigkeit ist bei uns einfach noch nicht erforderlich gewesen. :wink:
Ansonsten reicht uns Hubert seine im ersten Beispiel aufgeführte Lösung

Mit freundlichen Grüßen
Joachim
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Beitrag von hschmidt »

Hallo Jimmy,
der Dezimal Teil falsch berechnet/dargestellt werden ... nur wo liegt im
Code der "Denk"-Fehler ?
lass Dir mal 4 Stellen nach dem letzten ':' ausgeben.
Ich nehme an, dann stimmt die Reichenfolge.

Hans
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Krause hat geschrieben:Wahrscheinlich bekommt man nur einen korrekten Zeitstempel, wenn sich alle Workstationen diesen von ein und dem selben Zeitserver im Netzwerk holen.
Hi,

da die Netzwerkzugriffe ja etwas mehr Zeit brauchen als lokale wird das sicher nicht genauer sein. In Netzwerken wird aber normalerweise bei der Anmeldung an den Server automatisch die lokale Uhrzeit mit der des Server syncronisiert, dieser holt sich diese genaue Zeit regelmäßig von einem NTP Server. So haben alle korrekte Zeiten ... dazu habe ich mal was in der Wissensdatenbank geschrieben.
Gruß
Hubert
dirk
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 29
Registriert: Mi, 05. Jul 2006 15:17
Wohnort: 26689 Augustfehn

Beitrag von dirk »

Hallo Jimmy
Wenn Du eine Zeile hinzufügst :

Code: Alles auswählen

 ...
  // store decimal to nDec for later use
   nDec := nSec - INT(nSec)
   [color=red]nSec := nSec - nDec[/color]
   IF nSec >= 3600
   ...
Dann sollte es funktionieren. Dadurch werden die Dezimalstellen aus der Funktion Seconds(), die Du ja sowieso separat behandelts, aus den Berechnungen herausgehalten. Weil die Funktion seconds() nur zwei Dezimalstellen zurückliefert, müßte auch am Schluß die Darstellung
mit ...STRZERO(nDec*100,2) reichen


dirk
Zuletzt geändert von dirk am So, 02. Dez 2007 23:06, insgesamt 1-mal geändert.
Krause
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Mo, 08. Jan 2007 8:55
Wohnort: In Thüringen

Beitrag von Krause »

Hi Hubert,

du schriebst:
da die Netzwerkzugriffe ja etwas mehr Zeit brauchen als lokale wird das sicher nicht genauer sein. In Netzwerken wird aber normalerweise bei der Anmeldung an den Server automatisch die lokale Uhrzeit mit der des Server syncronisiert, dieser holt sich diese genaue Zeit regelmäßig von einem NTP Server. So haben alle korrekte Zeiten ... dazu habe ich mal was in der Wissensdatenbank geschrieben.
Meiner Meinung nach ist ausschlaggebend, in welchen Bezug die jeweilige Information (Daten) zur Zeit steht (Relation). Ich glaube kaum, dass die absolute Zeit unbedingt in jedem Fall erforderlich ist.

Die Genaue Zeit auf allen Workstationen über Synchronisation mit einem NTP - Server lässt sich auch nur bedingt mit einer gewissen Resttoleranz realisieren. Diese Toleranz ist meiner Meinung nach höher als die Toleranz bedingt durch Laufzeiten der Information im Netz.

Da es sich bei Windows um eine Multithreading - Betriebssystem handelt, hast du schon eine nicht genau spezifizierte Toleranz zwischen Zeitanfrage und Antwort. Starte mal einen zweiten "CPU - intensiven" Prozess parallel zu deiner Anfragen - in diesem Fall brauchen wir uns nicht mehr über Sekunden unterhalten …


Mit freundlichen Grüßen
Joachim
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

nur mal kurz zur Klärung meinerseits:

Bei dem Timestamp ging es mir nicht um die Atomzeit, sondern darum, dass ein Tageswechsel keine Probleme bereitet. Das würde nämlich, wie oben gezeigt, eine 24 Stunden Verschiebung bedeuten und das ist blöde.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

@Manfred,

das hatte ich schon so verstanden und oben eine Lösung angeboten, solange Xbase++ den Datentyp nicht richtig erkennt.

@Krause,

Sekundenlange Wartezeiten habe ich eigentlich nur wenn der Rechner auf eine nicht mehr existierende Netzwerkresource zugreift ;-)

Im Ernst ein ? date()+time() wird auf einem lokalen PC keine Sekunde brauchen, dummerweise reicht eine 1/100 wenn es die falsche ist um einen Tag dazwischen zu haben. Deshab ja auch der ganze Thread und ein eigener Datentyp ...

Ganz im Gegensatz zu euch bin ich aber der Meinung, wenn ich wirklich einen Timestamp brauche, dann muss der auch von einer exakten Uhrzeit aus berechnet werden. Was nützt es mir wenn meine Funktion sauber arbeitet, der Rechner aber 5 Minuten falsch geht ?

Wenn das keine Rolle spielt, braucht ihr auch keinen timestamp, sondern lediglich eine lose Angabe wann was war und solche Programme laufen in den seltesten Fällen um Mitternacht.

Daher habe ich auch nie Probleme mit date()+time() gehabt.

Bei Gericht z.B. spielt es eine große Rolle ob der Brief noch vor 12 Uhr (Frist eingehalten, alles OK) oder danach (das wars, nix geht mehr) eingeworfen wurde. Die haben Briefkästen die genau um die Zeit (mechanisch) umschalten - wenn auch sicher nicht so schnell wie unser Problem auf dem Rechner ;-)

Ich wüßte ehrlich gesagt keinen Anwendungsfall der die Präzision wirklich erfordert, denn um z.B. rechtliche Folgewirkungen zu erreichen müsste dann ja noch nachgewiesen werden, dass weder manipuliert wurde noch eine ungenaue Uhrzeit vorgelegen haben.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

bei Amazon bekommt man Verkaufsdateien zurück, mit diesem Timestamp. Da es bisher immer so der Fall war/ist, dass die immer noch alte Daten mitschicken, muß man anhand des Timestamp kontrollieren, wann denn schon übernommen wurde und wann nicht. Das würde dann eben in die Hose gehen, bei 24 Stunden verschub.
Aber wenn ich jetzt ganz ehrlich bin, habe ich schon wieder vergessen, warum ich das alles wissen wollte. Jaja, der Altersmuff.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

wenn du Daten von Amazon bekommst, die einen TimeStamp haben, brauchst du den doch nur zu lesen und nicht erzeugen ...
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Jaha,

aber es sollte doch nur ein BEISPIEL sein, wozu sowas wichtig sein kann. Irgendwann werde ich auch mal in die Verzückung kommen sowas generieren zu müssen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten