Gambas: Zeit und Datum

Aus Wikibooks


Zurück zum Gambas-Inhaltsverzeichnis.


Übersicht der Befehle[Bearbeiten]

Date Gibt das aktuelle Systemdatum zurück
Format ermöglicht verschiedene Ausgaben für Zeit und Datum
IsDate Gibt einen booleschen Wert zurück, der angibt, ob ein Ausdruck in ein Datum umgewandelt werden kann
Minute Gibt eine ganze Zahl im Bereich von 0 bis 59 zurück, die die Minute in der Stunde darstellt
Month Gibt eine ganze Zahl im Bereich von 0 bis 12 zurück, die den Monat im Jahr darstellt
Now Gibt das aktuelle Datum und die aktuelle Zeit auf Ihrem Computer zurück
Time, Time$ Gibt einen Wert vom Typ Date zurück, der die aktuelle Systemzeit angibt
Timer Gibt die Anzahl der Sekunden zurück, die seit Programmbeginn vergangen sind
Weekday Gibt den Wochentag als ganze Zahl zurück (1 = Sonntag, 2 = Montag, usw.)
Year Gibt das Jahr als ganze Zahl zurück
Wait Wartet eine vorgegebene Zeitspanne

Wait-Befehl (Pause)[Bearbeiten]

Der Wait-Befehl hat folgende Syntax.

WAIT [ Pause ]

Er ruft die Event Schleife auf. Falls für Pause ein Wert eingegeben wurde, dann bleibt er in der Warteschleife bis die Pausenzeit vergangen ist. Pause ist eine Fließkommazahl. Wenn man eine warteschleife von 100 ms programmieren will, muss man

 WAIT 0.1

eingeben.

Während der Waitschleife sind Tastatur- oder Mauseingaben nicht möglich. Nur Zeichnungs, Zeitgeber und Dateibeschreibungsereignisse wie Process_Write laufen noch ab.

Beispiel:

Das folgende Beispiel zeigt den Gebrauch des Wait-Befehls. Man braucht dazu eine Form mit einem Befehlsbutton und einer Textbox.

PUBLIC SUB Button1_Click()
  WAIT 5
  'wartet 5 Sekunden 
  WAIT 0.1 
  'wartet 100 Millisekunden 
  textbox1.Text = ""
END

Zeit[Bearbeiten]

Wichtige Befehle für die Zeit sind time und now. Der Timer ist eine Stopuhr die immer wieder ein bestimmtes Zeitintervall durchläuft und dann ein Ereignis startet. Vorsicht: die Timerfunktion ist etwas anderes als der Timer. Die Timerfunktion misst die Zeit in Sekunden die seit dem Programmstart vergangen ist.

Einfache Umrechnungen sollten Sekunden in Minuten und Stunden und Tage umrechnen können. Das ganze auch wieder rückwärts.

Time Befehl[Bearbeiten]

Ein gutes Beispiel für eine einfache Funktion ist der Befehl Time (= Zeit). Diese Funktion liefert die aktuelle Systemzeit. Sie können diese Funktion mit folgendem Befehl testen:

Print Time

Das folgende kleine Programm ohne Grafik gibt die Zeit im Direktfenster aus:

STATIC PUBLIC SUB Main()
  PRINT Time
END

Wenn Sie die Zeit immer wieder aktualisiert haben wollen, müssen Sie eine Schleife einbauen. Das Programm schaut dann so aus:

STATIC PUBLIC SUB Main()
  DIM i AS Integer
  FOR i = 1 TO 100
    PRINT Time
    WAIT 0.1
  NEXT
END

Das Programm gibt 10 Sekunden lang alle 100 Millisekunden die Zeit aus.

Ein ähnliches Beispiel für die Grafikausgabe aktualisiert die Zeitausgabe immer wieder. Dazu nutzt man den Timer, das Zeitgeber-Steuerelement. Dieser hat zunächst mit der aktuellen Zeit nichts zu tun, sondern löst ein Ereignis nach einer bestimmten Zeit aus.

Das folgende kleine Beispielprogramm kombiniert den Timer und die Timefunktion zu einer ständig aktualisierten Zeitangabe, wie sie diese auch rechts unten an ihrem PC finden.

Starten Sie ein neues Projekt. Nennen Sie es Zeitausgabe. Platzieren Sie anschließend eine Textbox auf Ihrer Form. Außerdem brauchen Sie das Zeitgebersteuerelement mit dem Uhrsymbol. Holen Sie sich beides mit F6 und einem Doppelclick auf das Symbol aus der Werkzeugkiste. Achten Sie darauf, dass der Zeitgeber mit der Enabled Eigenschaft erst angeschaltet werden muss. Dies können Sie bei den Eigenschaften des Timers zur Entwurfszeit einstellen oder Sie können es auch im Programmcode mit der Zeile

Timer1.Enabled = TRUE

erreichen.

PUBLIC SUB Timer1_Timer()
  Timer1.Enabled = TRUE
  TextBox1.Text = Time
END

Das Programm zeigt in der Textbox die aktuelle Zeit an. Diese wird jede Sekunde (= 1000 Millisekunden) aktualisiert.

Timer-Funktion[Bearbeiten]

Die Timer-Funktion hat nichts mit dem gleichnamigen Zeitgebersteuerelement zu tun.

Die Timer-Funktion gibt die Zeit in Sekunden aus, die seit Programmbeginn verstrichen sind.

In Visual Basic ist das anders. Hier gibt die Timer-Funktion die Anzahl der Sekunden zurück, die seit 0 Uhr verstrichen sind, mit einer Genauigkeit von 1/100 Sekunde.

Hinter dem Befehl Zeit seit Programmstart steht folgender Code:

PUBLIC SUB Button1_Click()
  TextBox1.Text = Timer
END

Beispiel:

PRINT Timer

Ergebnis variabel

0.291657006775

Ferner kann die Funktion dazu dienen, die Laufzeit eines Programms oder eines Programmteils zu ermitteln.

Beispiel:

Beginn = Timer 
'Schleife laufen lassen 
Ende = Timer 
Zeit = Ende - Beginn 
'Zeit wird in Sekunden gemessen 

Sie können die Timer-Funktion zusammen mit der Randomize-Anweisung verwenden, um einen Startwert für die Rnd-Funktion zu erzeugen.

Format Befehl für die Zeit und Datumsausgabe[Bearbeiten]

Der Format$ Befehl ist sehr umfassend in seinen Möglichkeiten. Im folgenden soll nur die Zeit und Datumsfunktion betrachtet werden. Allgemein funktioniert er so:

String = Format$ ( Expression [ , Format ] ) 

Der Befehl Format wandelt einen Ausdruck (Expression) in einen Textstring um, je nach dem wie man es selber haben will.

Die Funktion nutzt ihre länderspezifischen Einstellungen des Rechners und muss deswegen immer wieder überprüft werden, insbesondere wenn man von einer Sprache in die andere wechselt.

Benutzerdefinierte Datumsformate kann man folgendermassen ausgeben:

yy gibt die Jahreszahl in 2 Ziffern aus
yyyy gibt die Jahreszahl in 4 Ziffern aus
m gibt den Monat aus
mm gibt den Monat in 2 Ziffern aus
mmm gibt den Monat als abgekürzte Textform aus z.B. Aug = August
mmmm gibt den Monat in voller Bezeichnung aus
d gibt den Tag aus
dd gibt den Tag in 2 Ziffern aus
ddd gibt den Wochentag in abgekürzter Form aus
dddd gibt den Wochentag in voller Länge aus
/ gibt den Datumstrenner (=separator) aus
h gibt die Stunde aus
hh gibt die Stunde in 2 Ziffern aus
n gibt die Minuten aus
nn gibt die Minuten in 2 Ziffern aus
s gibt die Sekunden aus
ss gibt die Sekunden in 2 Ziffern aus
: gibt den Zeittrenner (= time separator) aus

Das zusammengefasste Beispielprogramm im Terminalmodus nutzt neben dem Formatbefehl noch die Funktion Now für den momentanen Zeitpunkt. Now = Jetzt.

STATIC PUBLIC SUB Main()
  PRINT Format$( Now, "mm/dd/yyyy hh:nn:ss" )
  PRINT Format$( Now, "m/d/yy h:n:s" )
  PRINT Format$( Now, "ddd dd mmm yyyy" )
  PRINT Format$( Now, "dddd dd mmmm yyyy" )
END

Die Ausgabe im Direktfenster mit deutscher Ländereinstellung schaut so aus:

11.12.2004 20:11:10
11.12.04 20:11:10
Fr 12 Nov 2004
Freitag 12 November 2004

Benutzerdefinierte Einzelbeispiele:

Befehl Ausgabe
PRINT Format$( Now, "mm/dd/yyyy hh:nn:ss" ) 04/15/2002 09:05:36
PRINT Format$( Now, "m/d/yy h:n:s" ) 4/15/02 9:5:36
PRINT Format$( Now, "ddd dd mmm yyyy" ) Mon Apr 15 2002
PRINT Format$( Now, "dddd dd mmmm yyyy" ) Monday April 15 2002

Problem mit Null Uhr Zeit rückwärts[Bearbeiten]

Siehe dazu die Anmerkung von InselAX.

Orginaltext Mitteilung:

Ich habe auch noch ein anderes Problem gelöst. Es hat mit dem Datentyp "DATE" zu tun. Date ist nicht gleich Date! Das Problem trat auf als ich die aktuelle Uhrzeit, die in mein Eingabeformular übernommen wird und mit Hilfe eines Timers dort weiterläuft, (an Hand einer Konfigurationsdatei) auf GMT (Greenwich-Zeit; hier in Deutschland -1 Stunde bei Winterzeit; -2 Stunden bei Sommerzeit) umstellen wollte. Da hat mein Timer beim Wechsel von 23:59 auf 00:00 Uhr Ortszeit angefangen rückwärts zu laufen... warum auch immer...!?!?.

Die Lösung besteht darin, etwa folgendes zu schreiben:

DIM gmt AS Date
DIM ortszeit AS Date
DIM korrektur AS Date

ortszeit = Time(Now)
gmt = ortszeit - korrektur

(wobei korrektur Val("01:00:00") ist und 01:00:00 aus einer Datei kommt)

Wenn ich jetzt z.B. schreiben würde:

TextBoxZeit.Text = gmt

dann würde der Timer beim Wechsel rückwärts laufen und gegen 00:00 zählen, wobei er bei er bei 01:00:00 anfängt.

Problemlösung ist erst mal:

zeit = gmt + Val("00:00:00")

und dann

TextBoxZeit.Text = gmt

Problem mit Greenwich Time[Bearbeiten]

Siehe dazu die Anmerkung von InselAX.

In einer GMT-TextBox läuft die Greenwich Zeit (hier in Deutschland Lokalzeit - 1 St.) Das funktionierte auch 23 Stunden lang. Für 1 Stunde von 00:00 Uhr bis 01:00 wurde zwar die korrekte Zeit in GMT angezeigt (23:00 bis 00:00), aber das Auslesen der Textbox brachte nur "00/00/00". Habe Benoit das Problem geschildert und er bat mich ihm meine Software zu schicken. Er schickte mir gestern einen Patch zurück....Ich hänge Dir ihn auch an. Es gab einen Bug in der Konvertierung von Float nach Date. Mit dem Patch funktioniert es. Du musst ihn in "./src/exec" (da wo Dein Gambas steckt....) kopieren und dann Gambas neu kompilieren.

Siehe: gbx_value.c

Gambas-Buch > Zeit und Datum > "Problem mit Null Uhr Zeit rückwärts" und "Problem mit Greenwich Time"[Bearbeiten]

Das Problem liegt an der Art, wie in Date das Datum und die Uhrzeit gespeichert werden.
Date ist ein Clone des Datentyps Double mit einem eingegrenzten Wertebereich von -657434 bis 2958465,99998843
Dabei wird der ganzzahlige Teil als Datum interpretiert und ermöglicht ein Datum von "01.01.100"-"31.12.9999". Der Nachkommateil wird als Zeit interpretiert, wobei folgende Formel verwendet wird:

(Sekunden seit Mitternacht) / (24*60*60)

Folglich gilt:

0 <= Zeit < 1

Da die Zeit somit niemals negativ sein kann, wird ein negatives Vorzeichen ignoriert.

Wenn du jetzt Dein Programm im Gambas-Buch betrachtest, wird in der Festlegung der Ortszeit durch die Time-Funktion der Vorkommateil gelöscht. nach 0 Uhr erhält gmt einen negativen Wert (-1 Stunde) durch die Ignorierung des Vorzeichens wird dadurch 1 Uhr. In der folgenden Stunde (bis 0:59:59 Uhr) wird gmt mit Werten von -1 Stunde bis -1 Sekunde versorgt, die in "1:00:00" - "0:00:01" umgewandelt werden. Die Zeit läuft also nur scheinbar rückwärts.

DIM gmt AS Date
DIM ortszeit AS Date
DIM korrektur AS Date

ortszeit = Time(Now)
gmt = ortszeit - korrektur 'Korrectur="1:00:00"

Hier ist also ein Fehler im Programm! Du mußt dafür sorgen, daß gmt niemals negativ wird. Der Fehler liegt in der Position der Time-Funktion. Vergleiche dazu folgendes Programm:

DIM gmt AS Date
DIM heute AS Date
DIM korrektur AS Date

heute = Now
gmt = Time(heute - korrektur)

Hier wird der Vorkommateil(Datum) erst nach Abzug der Korrektur gelöscht. Folglich wird gmt nicht negativ und die Zeitberchnung funktioniert richtig. Das Programm läst sich noch weiter vereinfachen:

DIM gmt AS Date
DIM korrektur AS Date
 
gmt = Time(Now - korrektur)

Übrigens kannst Du auf die gleiche Art das korrigierte Datum abfragen:

datum = Int(Now - korrektur)

Es liegt somit kein Bug vor, es ist nur eine Frage der richtigen Programmierung! (und der genauen Kenntnis des Datentyps Date)-- InselAX 16:28, 15. Jun. 2008 (CEST)


Datum[Bearbeiten]

Wichtige Befehle für das Datum sind date, weekday, now, format und format$

Interessant sind folgende Fragen:

  • Welcher Wochentag hat ein bestimmtes Datum? Siehe weekday Funktion
  • Wieviel Tage liegen zwischen 2 verschieden Datumsangaben?

Heute[Bearbeiten]

Das heutige Datum und die aktuelle Zeit erhält man mit dem Befehl Now.

Beispiel:

PRINT Now

Ausgabe:

05/16/2002 22:31:30 
'so lang ist es schon her seit Benoit dies programmiert hat

Das folgende Miniprogramm gibt das heutige Datum in einer Textbox aus :

Siehe: prgheute.png

Hinter dem Befehl Heute steht folgender Code:

PUBLIC SUB Button1_Click()
  TextBox1.Text = "Heute ist der " & Str$(Now) 
END

Anmerkung für VB6-Programme: In VB6 muß Str$ durch CStr ersetzt werden -- InselAX 17:58, 17. Jun. 2008 (CEST)

Beispiel 2:

Der Befehl Date verkürzt die Zeit- und Datumsausgabe auf die reine Datumsangabe. Probieren Sie dazu folgendes Programm. Sie brauchen nur eine leere Form, um es zu starten.

PUBLIC SUB Form_Open()
  PRINT Now
  PRINT Date(Now)
END

Da das Datum im Datentyp 'Date' ald ganzzahliger Teil gespeichert wird kann man Date(Now) auch durch Int(Now) ersetzen.-- InselAX 17:59, 17. Jun. 2008 (CEST)

Anmerkung für VB6-Programme: In VB6 muß Date durch DateValue ersetzt werden -- InselAX 17:58, 17. Jun. 2008 (CEST)

Wochentag[Bearbeiten]

Beispielprogramm:

Es gibt den Wochentag des heutigen Tages aus. Das Programm funktioniert im Terminalmodus:

STATIC PUBLIC SUB Main()
  PRINT WeekDay(Now)
  PRINT "Heute ist ";
  IF WeekDay(Now) = 1 THEN PRINT "Montag" 
  IF WeekDay(Now) = 2 THEN PRINT "Dienstag" 
  IF WeekDay(Now) = 3 THEN PRINT "Mittwoch" 
  IF WeekDay(Now) = 4 THEN PRINT "Donnerstag" 
  IF WeekDay(Now) = 5 THEN PRINT "Freitag" 
  IF WeekDay(Now) = 6 THEN PRINT "Samstag" 
  IF WeekDay(Now) = 7 THEN PRINT "Sonntag" 
END

Das Programm nutzt den Befehl Weekday und den Befehl Now von Gambas.

Das Programm geht davon aus, daß der Montag der erste Tag der Woche ist. In VB6 hat Weekday einen weiteren (optionalen) Parameter, der den ersten Tag der Woche angibt (1=So 2=Mo 3=Di 4=Mi 5=Do 6=Fr 7=Sa), wobei Sonntag die Voreinstellung ist. Damit das Programm in VB6 korrekt funktioniert, muß jedes 'WeekDay(Now)' durch WeekDay(Now,2) ersetzt werden.

Alternativ kann man den Wochentag auch mit dee Format-Anweisung anzeigen. Format(Now,"ddd") für den auf 2 Buchstaben abgekürzten Wochentag und Format(Now,"dddd") für den ausgeschriebenen Wochentag.-- InselAX 18:23, 17. Jun. 2008 (CEST)

Schaltjahr[Bearbeiten]

Das folgende Beispielprogramm berechnet für eine Jahreseingabe, ob das Jahr ein Schaltjahr ist. In einem Schaltjahr gibt es einen 29. Februar.

Hinter dem Befehl Ist das Jahr ein Schaltjahr? steht folgender Code:

PUBLIC SUB Button1_Click()
  DIM leapyear AS String

  'keine Eingabe
  IF TextBox1.Text = "" THEN
    TextBox2.Text = "Es wurde keine Jahreszahl angegeben!"
    RETURN
  ENDIF

  'Eingabe keine Zahl oder Zahl mit Punkt (z.B. 1234.5)
  IF NOT IsInteger(Val(TextBox1.Text)) OR TextBox1.Text LIKE "*.*" THEN
    TextBox2.Text = "\"" & TextBox1.Text & "\" ist keine Jahreszahl!"
    RETURN
  ENDIF

  IF Val(TextBox1.Text) MOD 400 = 0 THEN
    leapyear = " ist ein Schaltjahr."
  ELSE IF Val(TextBox1.Text) MOD 100 = 0 THEN
    leapyear = " ist eine Jahrhundertwende, aber kein Schaltjahr."
  ELSE IF Val(TextBox1.Text) MOD 4 = 0 THEN 
    leapyear = " ist ein Schaltjahr."
  ELSE
    leapyear = " ist kein Schaltjahr."
  ENDIF
 
  TextBox2.Text = "Das Jahr " & Val(TextBox1.Text) & leapyear 
END 

Wikipedia bietet weiterführende Informationen zum Thema Schaltjahr.

IsDate[Bearbeiten]

Die IsDate-Funktion liefert einen Wert TRUE oder FALSE, der anzeigt, ob eine Variable vom Datumstyp ist als ein gültiges Datum interpretiert werden kann. Damit ist beispielsweise auch eine Überprüfung auf Schaltjahr möglich.
IsDate("29.2.2008")=True
IsDate("29.2.2009")=False
-- InselAX 18:46, 17. Jun. 2008 (CEST)

Syntax: IsDate(Variant)

CDate[Bearbeiten]

Die CDate-Funktion wandelt einen Ausdruck in einen Datums-Datentyp um.

Syntax: CDate(Ausdruck)

Das Argument Ausdruck muss ein Zeichenfolgenausdruck oder ein numerischer Ausdruck sein, der als Datum interpretiert werden kann. Erlaubte Werte für Dateninformationen sind die Werte vom 1. Januar 100 (-657434) bis zum 31. Dezember 9999 (2958465). Der Tag 0 ist dabei der 30.12.1899. Dieser Tag ist mit CDate nicht zu erreichen, da CDate 0 als Uhrzeit ohne Datum interpretiert.-- InselAX 19:11, 17. Jun. 2008 (CEST)

Year[Bearbeiten]

Die Year-Funktion liefert eine Ganzzahl (Integer) aus dem Bereich von 100 bis 9999, die das Jahr in einem als Argument eingegebenen Datum darstellt.

Syntax: Year(Datum)

Anmerkungen: Das Datum-Argument ist ein beliebiger numerischer oder Zeichenfolgen-Ausdruck, der ein Datum und/oder eine Uhrzeit vom 1. Januar 100 bis zum 31. Dezember 9999 darstellen kann, wobei der 1. Januar 1900 gleich 2 ist. Zahlen links vom Dezimalzeichen in Datum stehen für das Datum, Zahlen rechts davon stehen für die Uhrzeit. Negative Zahlen stehen für Datumsangaben vor dem 30. Dezember 1899.

Weist Datum den Wert Null auf, dann liefert die Year-Funktion auch den Wert Null.

Fragen[Bearbeiten]

Gibt es in Gambas eine Befehl mit dem man das Datum verändern kann? (In Freebasic gibt es dazu den Befehl SETDATE: SETDATE month$ + "-" + day$ + "-" + year$)

Gibt es in Gambas einen Befehl mit dem man die Uhrzeit verändern kann? (In Freebasic gibt es dazu den Befehl SETTIME)

Unter Linux gehören Datum und Uhrzeit zu den „hoheitlichen“ Aufgaben, nur Benutzer bzw. Programme mit root-Rechten können sie ändern. Entsprechende Gambas-Befehle wären also unter Linux nutzlos.

Gibt es einen Befehl zur Zeitmessung?

Siehe oben: Timer-Funktion