Suche formatstring für datetime-object

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

gibt es eine Möglichkeit, die 'format()'-specifier mit denen von datetime-Objekten zu kombinieren?

Code: Alles auswählen

>>> d = datetime.datetime.now()
>>> '{0:<15%d.%m.%Y}'.format(d)                #Nicht das Ergebnis, das ich möchte
'<1530.11.2012'
>>> '{0:<15}'.format(d.strftime('%d.%m.%Y'))   #Nicht die Syntax, die ich möchte
'30.11.2012     '
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Welches Ergebnis möchtest Du denn?
https://www.xing.com/go/invite/18513630.6a91d4
BlackJack

@lutz.horn: Na doch wohl offensichtlich das Ergebnis bei der Syntax die er nicht möchte.
lunar

@mutetella Es gibt keine solche Möglichkeit.

".format()" ruft in der Regel für jeden Platzhalter die ".__format__()"-Methode des jeweiligen Objekts auf, in diesem Fall also "datetime.__format__". Die Dokumentation dieser Methode ist so einfach wie präzise:

Code: Alles auswählen

dt.__format__?
Type:       builtin_function_or_method
String Form:<built-in method __format__ of datetime.datetime object at 0x7f80ce5f6d78>
Docstring:  Formats self with strftime.
"datetime.__format__()" ist letztlich also äquivalent zu "datetime.strftime()":

Code: Alles auswählen

In [14]: dt.__format__("%d.%m.%Y")
Out[14]: '30.11.2012'

In [15]: dt.strftime("%d.%m.%Y")
Out[15]: '30.11.2012'

In [16]: dt.__format__("<15%d.%m.%Y")
Out[16]: '<1530.11.2012'

In [17]: dt.strftime("<15%d.%m.%Y")
Out[17]: '<1530.11.2012'
Die Formatspezifikation wird also entsprechend den Regeln für ".strftime()" interpretiert, und diese Regeln sehen keine besondere Interpretation für "<15" vor.

Diese Formatspezifikation ist spezifisch für Zahlen und Zeichenketten:

Code: Alles auswählen

In [22]: 'foo'.__format__('>15')
Out[22]: '            foo'

In [24]: dt.strftime("%d.%m.%Y").__format__(">15")
Out[24]: '     30.11.2012'
Du sieht also, dass Dein zweiter Versuch funktioniert, weil Du das Objekt zuerst in eine Zeichenketten konvertierst, so dass dann die Regeln für Zeichenkettenformatierung greifen.

Der Blick in den Quelltext des datetime-Moduls bestätigt dann auch, dass datetime.__format__ einfach nur an "datetime.strftime()" delegiert.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Danke für Eure Antworten!

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten