@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.