Brauche Hilfe für 'Datum + Zeit'

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Antworten
gambasso
Foriker
Beiträge: 1115
Registriert: Sa 17. Mär 2012, 09:55
Kontaktdaten:

Brauche Hilfe für 'Datum + Zeit'

Beitrag von gambasso » So 21. Okt 2018, 17:07

moin,
habe Probleme mit einem Satreceiver, der nimmt manchmal die programmierten Filme nicht auf.
Die Programmierung wird in einem File auf der Festplatte hinterlegt. Die Start- und Endzeit einer Aufnahme
wird in einer Computerzeit, die fortlaufend ab '1.1.1970 00:00' beginnt, als 10 stellige Integerzahl dort eingetragen.
Jetzt möchte ich gerne die Zeiten kontrollieren können, aber ich komme nicht so richtig mit Gambas klar.

Ziel ist es, die Zeiten einzugeben und dann entweder die Integerzahl zu erhalten oder umgekehrt.
Beispiel: gambas code
	CDatum = ("01/01/1970 00:00:00") 
	Print Format$(CDatum, "dd.mm.yyyy hh:nn:ss")  
Als Ergebnis bekomme ich: 01.01.1970 02:00:00
Da mach ich doch was falsch, oder warum zeigt das Ergebnis 2 Uhr an?

Wie kann ich es am Besten verwirklichen?
Gruss

besenmuckel
Foriker
Beiträge: 136
Registriert: Di 4. Nov 2014, 21:11
Kontaktdaten:

Re: Brauche Hilfe für 'Datum + Zeit'

Beitrag von besenmuckel » Mo 22. Okt 2018, 00:27

Entweder eingestellte Sprache, Zeit, Zeitzone, Sommer und Winterzeit oder doch die EU. :D
Weiss nicht wie der Receiver das macht.
Da mach ich doch was falsch, oder warum zeigt das Ergebnis 2 Uhr an?
Machst nichts falsch liegt am System. :roll:
Habs mal hier schnell mit Shell-Befehlen gemacht gemacht, wenn du die Sekunden brauchst.

Code: Alles auswählen

Public Sub Form_Open()

  Dim anfang As String
  Dim anfangUTC As String
  Dim aktuell As String
  Dim testemal As String
  Dim testergebnis As String
  Dim aktuelldatum As String
  
  testemal = "1234567890"
  
  Shell "date --date='@0'" Wait To anfang
  Shell "date -u  --date='@0'" Wait To anfangUTC
  Shell "date  +'%s'" Wait To aktuell
  Shell "date --date='@" & aktuell & "'" Wait To aktuelldatum
  Shell "date --date='@" & testemal & "'" Wait To testergebnis
  
  Print "anfang mit Datum = " & anfang
  Print "anfang in UTC mit Datum = " & anfangUTC
  Print "aktuell in sek = " & aktuell
  Print "aktuell mit Datum = " & aktuelldatum
  Print "testemal mit Datum = " & testergebnis
  
End
Meine Ausgabe hier

Code: Alles auswählen

anfang mit Datum = Do 1. Jan 01:00:00 CET 1970
anfang in UTC mit Datum = Do 1. Jan 00:00:00 UTC 1970
aktuell in sek = 1540168949
aktuell mit Datum = Mo 22. Okt 02:42:29 CEST 2018
testemal mit Datum = Sa 14. Feb 00:31:30 CET 2009
Beachte hier die Zeitzonen CET und CEST. Ich weiss nicht wie er es ausgeben kann in UTC ohne das ich mein System vermurkse.
Noch gefunden Datum anzeigen mit UTC geht mit Shell-Befehl

Code: Alles auswählen

date -u
Ausgabe Zukunft in Sekunden für den 30. Oktober 2018 - 17:00 Uhr normal mit Shell-Befehl

Code: Alles auswählen

date -d "10/30/2018 17:00:00" +"%s"
Ausgabe Zukunft in Sekunden für den 30. Oktober 2018 - 17:00 Uhr in UTC mit Shell-Befehl

Code: Alles auswählen

date -u -d "10/30/2018 17:00:00" +"%s"
Wenn du jetzt die Werte subtrahierst erhälst du die Sekunden, wenn du den Wert durch 60 teilst erhälst du die Minuten und nochmal teilen durch 60 die Stunden. Sollte dann 2 rauskommen, Unterschied der Mitteleuropäischen-Sommerzeit(Berlin) zu UTC.
Mein System Debian(Kanotix-Steelfire), wenn du Ubuntu verwendest kannst du auch online hier auf die entsprechende manpage von date klicken.
http://manpages.ubuntu.com/cgi-bin/sear ... _de&q=date

gambasso
Foriker
Beiträge: 1115
Registriert: Sa 17. Mär 2012, 09:55
Kontaktdaten:

Re: Brauche Hilfe für 'Datum + Zeit'

Beitrag von gambasso » Mo 22. Okt 2018, 11:17

moin,

mit dem 'Shell' Befehl habe ich es bisher noch nicht versucht. Ich werde es mal einfügen und mal die Unterschiede vergleichen.
Wenn Du es mit Gambas machst und kleinere Einheiten als Tage verwendest, bekommst Du eine Zahl mit einem Komma ',' raus, was mein Receiver auch nicht packt. Und es müssen immer die richtigen Datentypen und Formatierungen sein, sonst kommt Müll raus.
Und die Referenzzeit muß ich noch richtig wandeln. Ob Gambas das schafft?

Der Receiver holt sich die momentane Zeit aus den Signalen des Senders. Mal sehen was er demnächst bei der Winterzeit macht.
Gruss

tux_
Moderator
Beiträge: 950
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Brauche Hilfe für 'Datum + Zeit'

Beitrag von tux_ » Di 23. Okt 2018, 06:16

Die Start- und Endzeit einer Aufnahme wird in einer Computerzeit, die fortlaufend ab '1.1.1970 00:00' beginnt, als 10 stellige Integerzahl dort eingetragen.
Das nennt sich UNIX-Zeit und Gambas unterstuetzt die in der gb.util-Komponente:
gambas code
' gb.util muss geladen sein
Print Date.ToUnixTime(CDate("01/01/1970 00:00:00"))
' > 0
gambas code
CDatum = ("01/01/1970 00:00:00") 
Print Format$(CDatum, "dd.mm.yyyy hh:nn:ss")
Als Ergebnis bekomme ich: 01.01.1970 02:00:00
Da mach ich doch was falsch, oder warum zeigt das Ergebnis 2 Uhr an?
Du hast Format$() verwendet. Format$() ist zur Anzeige eines Wertes fuer den Nutzer am Bildschirm gedacht und beruecksichtigt folgerichtig die aktuelle Zeitzone des Systems. Die UNIX-Epoche begann zu einem Zeitpunkt, der in UTC 0 Uhr war, bei dem aber gleichzeitig in Deutschland die Uhren auf 2 Uhr standen (plus/minus Sommerzeit). Willst du dem Benutzer in Berlin, Shanghai oder Syndney aus irgendwelchen Gruenden die Zeit formatiert anzeigen, die sein Kollege in Greenwich sehen sollte, dann musst du das Date-Objekt mit ToUTC behandeln. Das subtrahiert die aktuelle Zeitzone:
gambas code
Dim dValentin As Date

' Der Zeitpunkt 1234567890 in der UNIX-Epoche, wie ihn Leute in Deutschland (Sommerzeit) gesehen haben
dValentin = Date.FromUnixTime(1234567890)
Print dValentin
Print Format$(dValentin, "dd.mm.yyyy hh:nn:ss")
' > 02/14/2009 01:31:30
' > 14.02.2009 01:31:30

' Der gleiche Zeitpunkt fuer Leute, die in UTC-Land auf die Uhr geschaut haben
dValentin = Date.ToUTC(dValentin)
Print dValentin
Print Format$(dValentin, "dd.mm.yyyy hh:nn:ss")
' > 02/13/2009 23:31:30
' > 13.02.2009 23:31:30
Aber Vorsicht mit den Konvertierungsroutinen! Es gibt in Gambas zwei Ebenen von Datumskonversion. Die untere Ebene beruecksichtigt die aktuelle Zeitzone *nicht*, sondern fuehrt nur numerische Operationen aus; zu dieser Ebene zaehlen alle Funktionen, die mit einem C beginnen: CStr, CInt, CFloat, CDate. Die obere Ebene ist fuer die Anzeige beim Benutzer gedacht und beruecksichtigt die aktuelle Zeitzone. Zu dieser Ebene gehoeren Str$(), Val() und Format$(). Man sollte die beiden Ebenen nur dann mischen, wenn man sich wirklich im Klaren darueber ist, was man tut.

Oben habe ich mit ToUTC die aktuelle Zeitzone von dValentin abgezogen, damit Format$() sie mir in meiner Zeitzone so anzeigt, wie sie eigentlich in der UTC-Zeitzone angezeigt wird. Ich habe den Datumswert korrigiert, damit Format$() ihn wieder zurueckkorrigiert, in das, was ich sehen will. Was passiert, wenn ich aber nicht mehr Format$(), sondern CStr() verwende?
gambas code
Print CStr(dValentin)
Print Date.ToUnixTime(dValentin)
' > 02/13/2009 21:31:30
' > 1234560690
Hier wird meine +0200 Berlin Sommerzeit nicht beruecksichtigt und ich sehe, dass die eigentlich gespeicherte Zeit nun nicht mehr mit dem urspruenglichen Zeitstempel uebereinstimmt.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast