Datum formatieren ?

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
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Nach ISO - Schreibweise Jahr/Monat/Tag ist die Sortierung unproblematisch und deswegen habe ich eine Funktion, die dieses Datum für die Ausgabe oder Eingabe formatiert. Ist es besser diese Funktion in die Klasse für die Verwaltung der Daten einzufügen oder in die Gui ?

Code: Alles auswählen

feld_namen = ('Datum:', 'Uhrzeit:', 'Termin:')

daten = [['2007-10-15', '10:00', 'blu blu'],
         ['2008-10-04', '18:00', 'beg beg'],
         ['2008-09-05', '09:00', 'dfg gfh'],
         ['2007-03-30', '12:00', 'bli bli'],
         ['2007-01-04', '15:00', 'ilb ilb']]

daten.sort()

def datum_formatieren(datum, teiler):
    datum_formatiert = datum.split(teiler[0])
    datum_formatiert.reverse()
    datum = teiler[1].join(x for x in datum_formatiert)
    return datum

def ausgabe():
    for daten_satz in daten:
        datum = datum_formatieren(daten_satz[0], ('-', '.'))
        daten_satz_formatiert = list(((datum), (daten_satz[1]), (daten_satz[2])))
        for name, eintrag in zip(feld_namen, daten_satz_formatiert):
            print name, eintrag

def eingabe():
    daten_satz = list()
    for name in feld_namen:
        eintrag = raw_input(name)
        daten_satz.append(eintrag)
    datum = datum_formatieren(daten_satz[0], ('.', '-'))
    daten_satz_formatiert = list(((datum), (daten_satz[1]), (daten_satz[2])))
    daten.append(daten_satz_formatiert)
    daten.sort()
        
    
ausgabe()
eingabe()
ausgabe()
gruß und dank frank
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

kaytec hat geschrieben:Ist es besser diese Funktion in die Klasse für die Verwaltung der Daten einzufügen oder in die Gui ?
Hallo frank!

Wenn das ISO-Format **NUR** für die Aus- und Eingabe relevant ist, dann gehört es zur Benutzerschnittstelle und nicht in die Programmlogik.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke Gerold !

Würde ich die Klasse zur Verarbeitung der Daten für ein andere Gui etc. verwenden, dann müsste ich diese Formatierung immer wieder neu machen ?! Also die 'Rohdaten' immer 'programmiersprachenverständlich' lassen ?

gruß frank
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

kaytec hat geschrieben:Würde ich die Klasse zur Verarbeitung der Daten für ein andere Gui etc. verwenden, dann müsste ich diese Formatierung immer wieder neu machen ?! Also die 'Rohdaten' immer 'programmiersprachenverständlich' lassen ?
Hallo frank!

Wenn du denkst, dass du diese Funktionen auch für andere GUIs verwenden könntest, dann ist ein eigenes Modul dafür angebracht. "tools" oder "common" oder wie auch immer du das Modul nennst ist dann egal.

Die Daten sollten intern immer in Rohform vorliegen. Ein Datum sollte ein datetime.datetime-Objekt sein. Eine Zahl sollte als Integer, Float oder decimal.Decimal vorliegen und nicht als Text. So kannst du damit rechnen und arbeiten. Erst bei der Ausgabe (Anzeige) wandelst du z.B. das Datum in einen String im ISO-Format um.

Das hat viele Vorteile. Unter Anderem auch den, dass du z.B. ein Datum auch als Datum in eine Datenbank schreiben kannst. So können Abfragen auf Zeitbereiche eingeschränkt werden. Wenn du eine Zahl als Text in eine Datenbank schreibst, dann kann die Datenbank damit nicht mehr rechnen.

Ich habe schon viel zu viel geschrieben. Ein einfaches "Intern - Rohdaten" hätte genügt. :lol:

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke Gerold !

Viele Antworten = Viele Fragen ! Müsste die Zeitangabe auch als Int/Float vorliegen ? Das Datum lässt sich ja so über Vergleichsoperatoren auswerten. Mit der Zeit ist sowas ja auch ganz schön:'Vor 5 Minuten war ihr Termin ..'.

gruß und dank frank
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

kaytec hat geschrieben:Müsste die Zeitangabe auch als Int/Float vorliegen ?
Hallo frank!

Schau dir mal das Modul "datetime" an. Ein Zeitpunkt (Datum und Uhrzeit) könnte als datetime.datetime-Objekt abgelegt werden. Ein Datum als datetime.date und eine Uhrzeit als datetime.time.

Du kannst damit auch rechnen:

Code: Alles auswählen

>>> import datetime
>>> start = datetime.datetime.now()
>>> stop = start + datetime.timedelta(days = 10)
>>> stop - start
datetime.timedelta(10)
>>> diff = stop - start
>>> diff.days
10
>>> diff.seconds
0
>>> 
Der Vorteil ist, dass du so etwas auch direkt in eine DB speichern kannst. Noch ein Vorteil ist, dass du damit auch direkten Zugang zur Methode "strftime" hast, welche für die Ausgabe von Zeit-Strings zuständig ist.
Und für die Eingabe von Zeitstrings ist die Methode "strptime" zuständig:

Code: Alles auswählen

>>> new_datetime = datetime.datetime.strptime("2000-01-01", "%Y-%m-%d")
>>> new_datetime
datetime.datetime(2000, 1, 1, 0, 0)
>>> 
Du kannst aber auch schon beim Erzeugen des Objekts einen Zeitpuntk angeben:

Code: Alles auswählen

>>> new_datetime = datetime.datetime(2000, 10, 15, 20, 15, 30)
>>> new_datetime
datetime.datetime(2000, 10, 15, 20, 15, 30)
>>> 
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo Gerold !

Ich danke Dir für die vielen Informationen und werde s mir mal alles genau anschauen.


gruß und dank frank
Antworten