RaspberryPi datetime + format

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Tim 747
User
Beiträge: 24
Registriert: Freitag 24. Februar 2012, 18:56

Hey,

ich würde gerne mit meinem RaspberryPi die aktuelle Zeit und das Datum ausgeben lassen und zwar in dem Format: dd.mm.yyyy hh:mm:ss . Aber habe dazu nichts gefunden was das mich weiter gebracht hat. Es ist übrigens keine Hausaufgabe sondern soll für einen Wecker dienen.

Gruß
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Tim747
Eigentlich hast Du Dir die Antwort bereits in den Threadtitel getippt... :wink:

Code: Alles auswählen

>>> import datetime
>>> print '{:%d.%m.%Y %H:%M:%S}'.format(datetime.datetime.now())
09.03.2014 19:39:11
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Tim 747
User
Beiträge: 24
Registriert: Freitag 24. Februar 2012, 18:56

oh ok das es so einfach ist hätte ich nicht gedacht.

Vielen Dank
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Braucht es dazu nicht irgend ein Display?

Vielleicht gibst Du dazu mal ein paar Details!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Tim 747
User
Beiträge: 24
Registriert: Freitag 24. Februar 2012, 18:56

ja ich brauche ein Display. momentan greife ich auf den Pi per ssh zu will aber später das ganze über ein LCD Display ausgeben. Darüber hinaus soll zu einer angegebenen Weckzeit Musik abspielen. Neben bei könnte mir noch jemand sagen wie ich

Code: Alles auswählen

print '{:%d.%m.%Y %H:%M:%S}'.format(datetime.datetime.now())
mit der Weckzeit vergleichen kann.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

In der Python-Dokumentation stehen alle Details, die man dazu wissen muss!

http://docs.python.org/2/library/dateti ... e.datetime
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Zum Sound abspielen:

Da könntest du aplay und popen verwenden (zumindest machen wir das hier so damit dich die Tür beim öffnen begrüßt :)
Tim 747
User
Beiträge: 24
Registriert: Freitag 24. Februar 2012, 18:56

ja das könnte ich mal ausprobieren momentan benutze ich dafür pyxine
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Tim 747 hat geschrieben:Neben bei könnte mir noch jemand sagen wie ich

Code: Alles auswählen

print '{:%d.%m.%Y %H:%M:%S}'.format(datetime.datetime.now())
mit der Weckzeit vergleichen kann.
Die ``print`` Anweisung schickt einen String an ``sys.stdout``. Da gibt es nichts, das Du vergleichen könntest.
Die `format`-Methode liefert Dir einen String. Diesen könntest Du mit einem anderen String vergleichen, was aber in Deinem Fall schnell zu unerwarteten Ergebnissen führen kann. Würdest Du zwei Zeiten (`datetime.datetime` Objekte) zuerst in einen String umwandeln und dann diese beiden Strings miteinander vergleichen, wäre das ungefähr so, als würde man aus der Zahl 10 erstmal einen String '10' machen, um diesen dann mit einem anderen String '9' zu vergleichen.

Code: Alles auswählen

>>> str(10) == str(9)
False
Solange Du nur auf Gleichheit vergleichst, geht das noch gut, allerdings fällst Du mit sowas

Code: Alles auswählen

>>> str(10) > str(9)
False
auf die Nase. Ein weiterer Grund, weshalb Du zwei Zeiten nicht per Strings miteinander vergleichen solltest, ist dieser:

Code: Alles auswählen

>>> '{:%d.%m.%Y %H:%M:%S}'.format(datetime.datetime(2014, 3, 10, 8, 45)) == '{:%d.%m.%Y %H:%M:%S}'.format(datetime.datetime(2014, 3, 10, 8, 45))
True
>>> '{:%d.%m.%Y %H:%M:%S}'.format(datetime.datetime(2014, 3, 10, 8, 45)) == '{:%d.%m.%Y  %H:%M:%S}'.format(datetime.datetime(2014, 3, 10, 8, 45))
False
So ein Fehler kann sich dann doch mal schnell einschleichen, abgesehen davon ist das schlecht zu lesen und unnötige Arbeit. Besser:

Code: Alles auswählen

>>> datetime.datetime(2014, 3, 10, 8, 45) == datetime.datetime(2014, 3, 10, 8, 45)
True
In welcher Form hast Du denn die Weckzeit vorliegen? Wenn nicht als `datetime.datetime` Objekt solltest Du diese erst einmal dahin umwandeln. Dann erstellst Du eine Schleife, innerhalb derer in einem bestimmten Interval (je nachdem, wie genau Du das haben möchtest) der Rückgabewert von `datetime.datetime.now()` mit Deiner Weckzeit verglichen wird. Hast Du eine Übereinstimmung, geht der Alarm los.
Innerhalb derselben Schleife kannst Du dann z. B. auch die Uhrzeit ausgeben lassen.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Für den ganz einfachen Vergleich wäre es vielleicht sinnvoll, intern mit Unixzeit zu arbeiten. Das ist einfach eine Gleitkommazahl mit Sekunden ab 1.1.1970. Im Moment ist z.B. ungefähr 1394445313.2579913.

Die kannst du dann ganz einfach mit > vergleichen:

Code: Alles auswählen

#!/usr/bin/env python3

import time

weckzeit = 1394449003.5862668

if time.time() > weckzeit:
    print("Aufstehen!")
Dann müsstest du bei der Eingabe der Zeit so früh wie möglich in Unixzeit wandeln und bei der Ausgabe so spät wie möglich. Intern dann immer mit der Unixzeit arbeiten. So kannst du z.B. sehr einfach addieren (einfach „time.time() + 3600“ um eine Stunde später zu erhalten) oder auch mit Differenzen arbeiten. Vergleiche halt ganz einfach mit > bzw. <.
xamiax
User
Beiträge: 1
Registriert: Montag 10. März 2014, 12:08

das mit dem wecker finde ich viel leichter und nutze das auch so:
mit mpd hast du einen konsolegesteuerten musikplayer, den du bequem auch von anderen rechnern steuern kannst (zb mit gmpc) oder aber auch sehr bequem vom smartphone.
mit cronjobs unter linux kannst du dann wöchentliche aufgaben für den raspberrypi erstellen. bsplweise dass er jeden montag um 07.00 uhr 'mpc play && mpc volume 100' ausführen soll, was die musik starten würde und die lautstärke voll aufdreht.
so benutze ich das auch :lol:
BlackJack

@Hellstorm: Die Unix-Zeit kann kein Mensch lesen und sagen wie spät es ist, während die Werte von `datetime`-Objekten in Zeichenketten umgewandelt sehr leicht für Menschen verständlich sind, und auch problemlos mit ``>`` oder ähnlichen Vergleichoperationen verglichen werden können. Man kann dort auch viel einfacher den Wochentag ermitteln und das Datum von der Zeit trennen, denn üblicherweise will man ja bei einem Wecker nicht für jedes Wecken das Datum neu festlegen sondern hat eher so Angaben wie Montag soll er um 8 Uhr morgends klingeln. Drück das mal in Code mit Sekunden seit Epoch aus und vergleich den Quelltext mit welchem der `datetime` verwendet.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@xamiax
Die Tatsache, dass `Tim 747` seine Frage hier gestellt hat, lässt vermuten, dass er an einer Lösung mit Python arbeitet...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Tim 747
User
Beiträge: 24
Registriert: Freitag 24. Februar 2012, 18:56

mutetella hat geschrieben:@xamiax
Die Tatsache, dass `Tim 747` seine Frage hier gestellt hat, lässt vermuten, dass er an einer Lösung mit Python arbeitet...
ganz genau und danke für die vielen lösungs wege. ich habe zwar gestern bereits diese Seite zugeschickt bekommen: http://docs.python.org/2/library/dateti ... e.datetime wollte mich allerdings erst heute damit befassen z.B. wußte ich noch gar nicht, dass man

Code: Alles auswählen

datetime.datetime(2014, 3, 10, 8, 45)
benutzen kann.
Dann erstellst Du eine Schleife, innerhalb derer in einem bestimmten Interval (je nachdem, wie genau Du das haben möchtest) der Rückgabewert von `datetime.datetime.now()` mit Deiner Weckzeit verglichen wird. Hast Du eine Übereinstimmung, geht der Alarm los.
Innerhalb derselben Schleife kannst Du dann z. B. auch die Uhrzeit ausgeben lassen.
genauch so wollte ich es machen.
Tim 747
User
Beiträge: 24
Registriert: Freitag 24. Februar 2012, 18:56

momentan sieht mein Script so aus:

Code: Alles auswählen

#!/usr/bin/python3
# coding=UTF-8

import datetime
import pyxine
import time
import os

clear = lambda: os.system('clear')

while True:
	print('{:%d.%m.%Y %H:%M:%S}'.format(datetime.datetime.now()))
	if datetime.datetime.now() == datetime.datetime(2014, 3, 10, 17, 55, 0, 0):
		Xine = pyxine.Xine()
		stream = xine.stream_new()
		stream.open('/home/pi/python/track.mp3')
		stream.play()
		time.sleep(160)
	time.sleep(0.9)
	clear()
könnte mir jemand weiter helfen ,weil der Alarm nicht ausgelöst wird :K
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das kann nicht funktionieren, da die Zeiten niemals (bzw. nur sehr selten) identisch sind. Du musst daher testen, ob die angezielte Zeit überschritten wurde.

Code: Alles auswählen

last_time = datetime.datetime.now()
while True:
    now = datetime.datetime.now()

    if last_time < target_time <= now:
        #hier dein Ereignis

    ...
    last_time = now
Das Leben ist wie ein Tennisball.
BlackJack

@Tim 747: Es ist einfach extrem unwahrscheinlich das die beiden Objekte den gleichen Wert haben. Die `now()`-Methode müsste auf die Mikrosekunde genau zu dem Zeitpunkt des Wertes des anderen Objekts aufgerufen werden:

Code: Alles auswählen

In [1]: import datetime

In [2]: datetime.datetime.resolution
Out[2]: datetime.timedelta(0, 0, 1)

In [3]: datetime.datetime.resolution.microseconds
Out[3]: 1
Du müsstest also das Ergebnis von dem `now()`-Aufruf noch von den Sekunden und Mikrosekunden befreien. Das kann man mit der `replace()`-Methode machen.

Beim Vergleichswert muss man die Sekunden und Mikrosekunden übrigens nicht explizit angeben. Der Default-Wert für diese Argumente ist bereits 0.

`Xine` würde nach den üblichen Konventionen übrigens klein geschrieben, denn es ist kein Datentyp.
Tim 747
User
Beiträge: 24
Registriert: Freitag 24. Februar 2012, 18:56

vielen vielen dank wobei das ja irgendwie logisch ist das das niemals(oder mit einer sehr geringen Wahrscheinlichkeit) auf die Microsekunde genau ist :idea: aber jetzt funktieoniert es endlich.
Antworten